Javascript 带有函数动态数组的Async-parallel()
我正在为nodejs使用优秀的caolan“async”模块: 我有以下代码: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
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“结果”