我有几个文件需要写入远程服务器。正如您在我的代码中看到的那样,我在异步范围内读取这些文件,并在它们可用时将它们写入远程服务器。而不是所有文件,只有最后一个文件成功传输到远程服务器。我把console输出语句放在readfile回调函数中并检查路径变量值。它输出最后三个文件名。所以我怀疑最后一个readfile调用是否覆盖了以前的调用。在进入下一次迭代之前,不应该等待回调函数调用吗?
var attachments = ['1.jpg','2.jpg','3.jpg'];
var request = require('request');
var option = {
url: "http://www.xxxxxxx.xxxx",
headers: {"content-type": "multipart/form-data"}
};
async.each(attachments, function(att, callback){
path = imagePath + "\\" + att;
fstat = fs.statSync(path);
fsize = fstat["size"];
fs.readFile(path, function(err, data){
if(err)
{
return callback(err);
}
else{
option.body = data;
request.post(option,function(err,response,body) {
if (err) {
return callback(err);
}
else{
console.log(option);
callback();
}
});
}
});
}, function(err){
if (err) {
console.log(err);
}
else
{
console.log("finish");
}
});
答案 0 :(得分:0)
在进入下一次迭代之前,不应该异步等待回调函数调用吗?
不,你在描述async.eachSeries
的作用。 async.each
以 parallel 运行每个所有任务。
你的问题是这里只有一个option
对象。您在console.log(option)
异步运行的函数内部执行request.post
。在每个request.post
运行之后,该回调函数将运行。由于您只有option
个对象,因此它将具有最后body
回调分配的最终fs.readFile
值。
这里的解决方案是让每个each
函数调用创建自己的option
对象:
async.each(attachments, function(att, callback){
var option = {
url: "http://www.xxxxxxx.xxxx",
headers: {"content-type": "multipart/form-data"}
};