0

URL から特定のファイルをダウンロードしたいのですが、1 つのファイルしか書き出されないという問題が発生しているようです。以下は私のコードです:

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 に答える