如何在for循环中处理nodejs的回调函数?

时间:2014-07-21 06:17:33

标签: javascript node.js mongodb mongoose

我的猫鼬模式是

skills : [
        {
            name : {type : String},
            count : {type :Number, default:0}
        }
    ]

我正在使用for循环触发更新查询,因为我想更新文档数组,我的查询是

  for(var i=0;i<array.length;i++){
   Talent.update({userName : userName}, {$addToSet: {skills :{$each: [{name : array[i]}]}}},callback);
 }

这里回调每次更新查询都会返回。 for循环完成后,我只想用数据库结果进行一次回调。 我该怎么办?

2 个答案:

答案 0 :(得分:2)

这看起来好像只是要求修改一个文档,但是你现在正在循环更新,你不需要这样做。

此外,您要求修改的结果实际上属于.findOneAndUpdate()之类的方法,因为该表单返回修改后的文档。 .update()表单可以应用于多个文档,因此不会在结果中返回修改后的内容:

所以它真的看起来而不是循环,然后你需要做的就是&#34;重新塑造&#34;你的输入数组:

    var array = ["Tennis","Football"];
    array = array.map(function(x) {
        return { "name": x };
    });
    // array is now [{ "name": "Tennis" }, { "name": "Football" }]

    Talent.findOneAndUpdate(
        { "userName": userName },
        { 
            "$addToSet": { "skills": { "$each": array } }
        },
        function(err,doc) {
            if (err) throw err;
            // doc contains all array members added
            console.log( JSON.stringify( doc, undefined, 4) );
            callback(); // Your outer callback
        }
    );

$each修饰符在最后一种情况下采用数组参数,因此只需在原始数组中重新整形输入参数以匹配更新实际文档时预期的结构。

还有其他方法可以处理循环执行,但看起来在这种情况下你不需要它。

答案 1 :(得分:1)

我认为你需要这样的东西:

var update = function(callback) {
    var result = {};
    var len = array.length;
    var done = 0;
    for (var i = 0; i < len; i++) {
        Talent.update({
            userName: userName
        }, {
            $addToSet: {
                skills: {
                    $each: [{
                        name: array[i]
                    }]
                }
            }
        }, function(err, talent) {
            result[i] = {
                err: err,
                talent: talent
            };
            done++;
            if (done === len)
                callback(result);
        });
    }
};

现在你可以打电话

update(function(result) {
    // Your code here.
};

无论如何我没有测试过,所以可能会遇到一些问题。