异步mongodb更新循环中最后一次迭代后的重定向
Redirection after last iteration in a loop of asynchronous mongodb updates
我正在用Node/Express/Mongodb/Mongoskin 构建一个应用程序
我有这个代码来更新一组文档:
db.collection('invoices').find().toArray(function(err, dbDocs) {
if (err) throw err;
// Change one, none or several fields named 'paid' in the fetched invoices array
...
// Loop trough the changed dbDocs and use it to update the database.
for (var i = 0, j = dbDocs.length; i < j; i += 1) {
db.collection('invoices').update({_id:dbDocs[i]._id}, {$set:{ paid: dbDocs[i].paid }}, function(err, result) {
if (err) throw err;
// Trigger a redirect after the last iteration.
if (!err && (i === dbDocs.length - 1)) {
console.log('"i" is right now: ', i);
res.redirect('/superadmin/fakturor');
}
});
}
});
这将不起作用,因为update()函数有一个回调,当回调最终触发for循环时,这意味着重定向将被调用四次。我希望重定向被调用一次,即在最后一次迭代之后,并且没有错误。
如何重写此代码以使其工作?
首先注意i = dbDocs.length
应该是:i == dbDocs.length-1
现在,试试这个:
for (var i = 0; i < dbDocs.length; i += 1) {
(function (i) {
db.collection('invoices').update({ _id: dbDocs[i]._id }, { $set: { paid: dbDocs[i].paid } }, function (err, result) {
if (err) throw err;
// Trigger a redirect after the last iteration.
if (!err && (i == dbDocs.length-1)) {
console.log('i: ', i);
res.redirect('/superadmin/fakturor');
}
});
})(i)
}
}
这是async
库的一个典型用例,您可以从中使用一些辅助函数来处理并发问题。
您可以使用async.each(arr, iterator, callback)
,它将在数组的每个成员上调用iterator()
。当所有迭代器都完成后,它调用callback
函数。
var async = require('async');
var updateDoc = function (elem, cb) {
db.collection('invoices').update({_id:elem._id}, {$set:{ paid: elem.paid }}, cb);
}
var done = function (err) {
if (err)
return console.error(err.message);
res.redirect('/superadmin/fakturor');
}
async.each(dbDocs, updateDoc, done);
相关文章:
- 通过javascript重定向html传递php变量
- JavaScript下拉菜单-点击按钮并根据所选值重定向到url
- 使用angular重定向到html页面
- 如何在chrome扩展中重定向到html页面
- 无法从jquery Mobile导航栏重定向到另一个页面
- ng视图外的链接重定向到ng视图内的页面
- 如何在javascript中迭代数字列表
- 在phonegap应用程序内部重定向不起作用
- JS:检查URL中的参数,然后迭代一个参数为var的函数
- 如何迭代Array.prototype函数
- 如何使用jquery迭代具有相同属性的html元素并查找onclick事件
- CORS-重定向到第二个GET正在接收的页面
- 在ejs-partial中对JSON对象进行迭代
- AJAX不会在文件上传后重定向到网页-POST方法
- 重定向时角度刷新浏览器
- 通过链接重定向不;我不在jstree中工作
- 异步mongodb更新循环中最后一次迭代后的重定向
- 通过函数(动画)每次重新迭代时重置画布笔划.怎样
- Javascript - 需要重复数组迭代,每x秒更改一次元素的类
- JavaScript / jQuery:在最后一次迭代时重启for循环