Fab*_* B. 3 javascript mongoose node.js express 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 < 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
}
);
};
Run Code Online (Sandbox Code Playgroud)
我的数组包含两个元素,但console.log()一直告诉我"未定义".
我错过了什么?
ebo*_*man 11
你的问题是:
var deleteFunction = function(callback) {
var id = toDeleteIds[i];
Run Code Online (Sandbox Code Playgroud)
因为在执行每个回调函数时,i将具有相同的值toDeleteIds.length.闭包不会"捕获"外部变量在创建时所具有的值 ; 这"陷阱"的任何值外变量在它的时间的参考执行(在这种情况下要等到好你后for循环完成.
为了"捕获" i创建回调函数时的值,需要i创建一个函数的参数来调用以创建回调函数.你需要类似的东西
var deleteFunction = makeDeleteFunction(i, callback);
Run Code Online (Sandbox Code Playgroud)
然后在回调之外创建一个单独的函数:
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);
});
};
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7618 次 |
| 最近记录: |