0

我想从 URL 下载特定文件,但似乎只有一个文件被写出时出现问题。以下是我的代码:

var filenames=["a.txt", "b.txt", "c.txt"];
for(var i in filenames) {
  var url = 'http://myhomepage/'+filenames[i];
  restler.get(url, {
    }).on('complete', function (data) {
      fs.writeFile('./'filenames[i], data, function(err, data) {
      })
    });      
  }

似乎唯一被写出的文件是“c.txt”而不是其他文件。有什么问题以及如何解决?

4

1 回答 1

1

这是因为restler.get是异步的,并且在写入第一个文件时,for循环位于最后一个元素上。您可以通过使用forEach并为您迭代的每个元素创建一个单独的范围来解决此问题:

var filenames=["a.txt", "b.txt", "c.txt"];
filenames.forEach(function(filename) {
  var url = 'http://myhomepage/'+filename;
  restler.get(url, {
    }).on('complete', function (data) {
      fs.writeFile('./' + filename, data, function(err, data) {
      })
    });      
  }
} );

或者,如果您想让您的实现更改较少,您可以创建一个包装函数来创建一个单独的范围:

var filenames=["a.txt", "b.txt", "c.txt"];
for(var i in filenames) {
  (function(i) {
  var url = 'http://myhomepage/'+filenames[i];
  restler.get(url, {
    }).on('complete', function (data) {
      fs.writeFile('./'filenames[i], data, function(err, data) {
      })
    });  
  }(i));    
  } 
于 2013-07-08T03:12:29.490 回答