异步不按预期工作

时间:2015-05-27 15:25:46

标签: node.js asynchronous

我有几个文件需要写入远程服务器。正如您在我的代码中看到的那样,我在异步范围内读取这些文件,并在它们可用时将它们写入远程服务器。而不是所有文件,只有最后一个文件成功传输到远程服务器。我把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");
    }
});

1 个答案:

答案 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"}
    };