如何使用函数的回调值执行循环

时间:2013-08-30 11:13:42

标签: javascript node.js couchdb


每次_rev更改时,我都会尝试多次更新couchdb。所以我需要等到我从第一次更新获得回调。但是在收到回调之前,Node.js循环似乎在迭代。这是我的代码

function upload(req, res, next) {
if ('POST' !== req.method) return next();
rev = req.param('rev');
idAndRevData = {
        id : "some_doc_id",
        rev : rev
       };
for (x in array){
   var item = array[x];
   db.saveAttachment(idAndRevData, attachmentData, function (err, reply) {
      if (err) {
         console.dir(err)
         return
       } 
       idAndRevData.rev = reply.rev;
       callback("done");
   });
 }
}

我尝试使用似乎无效的async.each

    async.each(array,fileupload,function(err){
       if(err)thorw err;
       console.log("done")
    });

在这里,我可以打印“完成”的数量与array的长度一样多,但fileupload内的代码无法正常工作

2 个答案:

答案 0 :(得分:0)

那样:

function upload(req, res, next) {
    if ('POST' !== req.method) return next();
    rev = req.param('rev');
    idAndRevData = {
        id : "some_doc_id",
        rev : rev
    };

    var processData = function() {
        if(array.length == 0) {
            callback("done");
            return;
        }
        var item = array.shift();
        db.saveAttachment(idAndRevData, attachmentData, function (err, reply) {
            if (err) {
                console.dir(err)
                return
            } 
            idAndRevData.rev = reply.rev;
            processData();
        });
    }
}

因此,只有在调用db回调时,才能逐个获取数组的元素。

答案 1 :(得分:0)

async.each并行执行迭代器,因此请使用async.eachSeries。这将确保请求连续执行,next仅在当前请求完成时调用。