Javascript 正在尝试从URL下载并使用node.js保存到文件。。我的问题是什么?
我想从一个URL下载特定的文件,但似乎我只有一个文件被写出来的问题。以下是我的代码:Javascript 正在尝试从URL下载并使用node.js保存到文件。。我的问题是什么?,javascript,node.js,Javascript,Node.js,我想从一个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('./'filenam
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”,而不是其他文件。问题是什么以及如何解决?这是因为
restler.get
是异步的,在写入第一个文件时,for循环位于最后一个元素上。您可以通过使用和为迭代的每个元素创建单独的作用域来解决此问题:
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));
}
是否有一些事件在完成列表中的所有文件时触发,我可以像某种类型的onEnd一样使用其中任何一种方法来console.log done?@Rolando:您可以使用,它允许您指定一个
回调
,一旦对集合中的所有元素执行异步操作,就应该调用该回调。