Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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 带有函数动态数组的Async-parallel()_Javascript_Node.js_Express_Mongoose_Async.js - Fatal编程技术网

Javascript 带有函数动态数组的Async-parallel()

Javascript 带有函数动态数组的Async-parallel(),javascript,node.js,express,mongoose,async.js,Javascript,Node.js,Express,Mongoose,Async.js,我正在为nodejs使用优秀的caolan“async”模块: 我有以下代码: exports.manageComments = function(req, res) { var toDeleteIds = []; var deleteFunctions = []; if (req.body.doDelete) { toDeleteIds = req.body.doDelete; } var i; for ( i = 0; i &l

我正在为nodejs使用优秀的caolan“async”模块:

我有以下代码:

exports.manageComments = function(req, res) {
    var toDeleteIds = [];
    var deleteFunctions = [];
    if (req.body.doDelete) {
        toDeleteIds = req.body.doDelete;
    }
    var i;
    for ( i = 0; i < toDeleteIds.length; i++ ) {
        var deleteFunction = function(callback) {
            var id = toDeleteIds[i];
            console.log(id);
            Comment.findOne({_id:id}, function(err, found) {            
                if (!err) found.remove(callback);
            });
        }
        deleteFunctions.push(deleteFunction);
    }
    async.parallel(
        deleteFunctions,
        function(err,results) {
            exports.comments(req, res); //render a view
        }
    );
};
exports.manageComments=函数(req,res){
var toDeleteIds=[];
var deleteFunctions=[];
if(要求正文部分){
toDeleteIds=req.body.doDelete;
}
var i;
对于(i=0;i
我的数组包含两个元素,但console.log()一直告诉我“未定义”

我遗漏了什么?

您的问题在于:

    var deleteFunction = function(callback) {
        var id = toDeleteIds[i];
因为在执行每个回调函数时,
i
将具有与
toDeleteIds.length
相同的值。闭包不会“捕获”外部变量创建时的值;它“捕获”外部变量在执行时具有的任何值的引用(在本例中,只有在
for
循环完成之后才会出现)

为了在创建回调函数时“捕获”
i
的值,需要将
i
作为创建回调函数所调用函数的参数

    var deleteFunction = makeDeleteFunction(i, callback);
然后在回调外部创建一个单独的函数:

function makeDeleteFunction(i, callback) {
    return function(callback) {
        var id = toDeleteIds[i];
        console.log(id);
        Comment.findOne({_id:id}, function(err, found){            
            if (!err) found.remove(callback);
        });
     };
}

ebohlman已经正确地识别了这个问题。但是,我仍然认为创建闭包数组是非常低效的,而且是不必要的。下面是用一个函数实现相同功能的更短、更简单的代码:

exports.manageComments=函数(req,res){
var toDeleteIds=[];
if(要求正文部分){
toDeleteIds=req.body.doDelete;
}
var deleteFunction=函数(id,回调){
console.log(id);
Comment.findOne({u id:id},函数(err,found){
如果发现(!err),则删除(回调);
});
}
forEach(toDeleteIds、deleteFunction、function(err、results){
exports.comments(req,res);//呈现视图
});
};

从另一个角度来看,如果您不需要在每个要删除的
注释
文档上启动Mongoose
删除
中间件,您可以一次性删除所有已识别的注释:

Comment.remove({_id: {$in: toDeleteIds}}, function(err, numRemoved) {
    exports.comments(req, res); //render a view        
}

我有这个嫌疑!你真的很擅长解释它!谢谢你1000次!:D我稍后会接受答案,让我先试试!你是对的,但这次我更喜欢做单次更新,只是为了学习。谢谢你。最后我采纳了你的解决方案,非常感谢!不过这个问题只是为了知道“闭包”是如何实现的机制工作。很遗憾,最后没有传递@zzen“结果”