Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何处理for循环中nodejs的回调函数?_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

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

Javascript 如何处理for循环中nodejs的回调函数?,javascript,node.js,mongodb,mongoose,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}, {$addToSe

我的猫鼬模式是

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(var i=0;i我想你需要这样的东西:

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);
        });
    }
};

无论如何,我没有测试它,所以它可能有一些问题。

我想你需要这样的东西:

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);
        });
    }
};

无论如何,我没有测试它,所以它可能有一些问题。

我想你需要这样的东西:

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);
        });
    }
};

无论如何,我没有测试它,所以它可能有一些问题。

我想你需要这样的东西:

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()
表单可应用于多个文档,因此不会返回结果中修改过的内容:

因此,它看起来确实像是一个循环,而不是一个循环,那么您所需要做的就是“重新塑造”您的输入数组:

    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
        }
    );
在最后一种情况下,修饰符接受一个数组参数,因此只需重新调整原始数组中的输入参数,使其与更新实际文档时预期的结构相匹配


还有其他方法可以处理串行循环,但在这种情况下,您似乎不需要它。

这看起来确实像是您只要求修改一个文档,但如果您当前正在循环更新,则不需要这样做

此外,您还需要修改的结果,它实际上属于这样的方法,因为该表单返回修改过的文档。
.update()
表单可应用于多个文档,因此不会返回结果中修改过的内容:

因此,它看起来确实像是一个循环,而不是一个循环,那么您所需要做的就是“重新塑造”您的输入数组:

    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
        }
    );
在最后一种情况下,修饰符接受一个数组参数,因此只需重新调整原始数组中的输入参数,使其与更新实际文档时预期的结构相匹配


还有其他方法可以处理串行循环,但在这种情况下,您似乎不需要它。

这看起来确实像是您只要求修改一个文档,但如果您当前正在循环更新,则不需要这样做

此外,您还需要修改的结果,它实际上属于这样的方法,因为该表单返回修改过的文档。
.update()
表单可应用于多个文档,因此不会返回结果中修改过的内容:

因此,它看起来确实像是一个循环,而不是一个循环,那么您所需要做的就是“重新塑造”您的输入数组:

    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
        }
    );
在最后一种情况下,修饰符接受一个数组参数,因此只需重新调整原始数组中的输入参数,使其与更新实际文档时预期的结构相匹配


还有其他方法可以处理串行循环,但在这种情况下,您似乎不需要它。

这看起来确实像是您只要求修改一个文档,但如果您当前正在循环更新,则不需要这样做

此外,您还需要修改的结果,它实际上属于这样的方法,因为该表单返回修改过的文档。
.update()
表单可应用于多个文档,因此不会返回结果中修改过的内容:

因此,它看起来确实像是一个循环,而不是一个循环,那么您所需要做的就是“重新塑造”您的输入数组:

    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
        }
    );
在最后一种情况下,修饰符接受一个数组参数,因此只需重新调整原始数组中的输入参数,使其与更新实际文档时预期的结构相匹配


有其他方法可以处理串联循环,但在这种情况下,您似乎不需要它。

一般问题似乎很清楚,但这里不清楚的是在“技能”中的文档下使用“计数”字段数组。你不在更新中引用它,那么你的意图是什么?我不是在处理count。问题是我想要在循环完成时调用回调函数。回调应该返回执行查询的结果。一般的问题似乎很清楚,但这里不清楚的是“count”的用法“技能”中文档下的字段数组。你不在更新中引用它,那么你的意图是什么?我不是在处理count。问题是我想要在循环完成时调用回调函数。回调应该返回执行查询的结果。一般的问题似乎很清楚,但这里不清楚的是“count”的用法“技能”中文档下的字段数组。你不在更新中引用它,那么你的意图是什么?我不是在处理count。问题是我想要在循环完成时调用回调函数。回调应该返回执行查询的结果。一般的问题似乎很清楚,但这里不清楚的是“count”的用法“技能”中文档下的字段数组。你在更新中没有引用它,那么你的意图是什么?我不是在处理计数。问题是我想在循环完成时调用回调函数。回调应该返回执行查询的结果。谢谢你的帮助和代码。这对我帮助很大。谢谢。@SaurabhGhewari我很感兴趣。突然,这并不能解决问题我们的问题到底如何?它不能解决您没有正确指定的问题吗?为什么要删除accept?感谢您的帮助和代码。它帮助了我很多。谢谢。@SaurabhGhewari我很好奇。突然,这不能解决您的问题到底如何?它不能解决您失败的问题吗