【发布时间】:2016-12-05 18:20:08
【问题描述】:
我最近开始在我的 Node.js 项目中使用箭头函数、promise (bluebird) 和 MongoDB。正如你在下面看到的,我承诺了所有的 mongodb 原生驱动。到目前为止,它就像一个魅力。
现在,我想使用 .forEach() 方法,我想知道应该如何使用它。这是想法:
var Promise = require("bluebird");
var mongodb = Promise.promisifyAll(require("mongodb"));
var MongoClient = mongodb.MongoClient;
MongoClient
.connect('the_URL_of_my_database')
.then( (database) => {
var db = database;
var myCollection = database.collection('my_collection');
myCollection
.find('my_awesome_selector')
.forEach( (document) => {
var selector = {hashkey: document.hashkey};
var update = {$set: {data: 'my_new_data'}};
myCollection
.updateOne(selector, update)
.then( (response) => {
// do something if needed
})
.catch( (err) => {/*update error handling*/});
})
.then( (/*do we get some kind of input here ?*/) => {
// do something once EVERY document has been updated
})
.catch( (err) => {/*forEach error handling*/});
})
.catch( (err) => {/*connection error handling*/});
我的问题是:
- 承诺的 .forEach() 返回什么?这是一个承诺,一旦所有文件都被更新,就会得到解决?
- 如果我的代码不起作用,您知道如何正确实现它吗?
[对我有很大帮助的可选问题:]
- 我注意到 MongoDB 驱动程序中的 .each() 方法。它被标记为“已弃用”,但它有什么用处,还是我应该坚持使用 .forEach() ?
- 整个 sn-p 对您来说是否有意义,或者我应该注意哪些新手错误/改进?
非常感谢您的任何回答或建议!
[编辑:我确定了更新。我觉得我又回到了回调地狱]
【问题讨论】:
-
如果你使用
promisifyAll,那么.forEach根本不会改变。返回承诺的将是.forEachAsync。但是,集合的forEach回调不是 nodeback 而是迭代器,所以你根本不能承诺它。 -
@Bergi :我理解我的错误。但是,我怎样才能实现顺序:(1)选择集合中的一组文档,有或没有光标; (2) 对每个选定的文档执行一个操作; (3) 解决所有先前的操作后做其他事情吗?
-
IIRC,
.toArrayAsync工作,然后让您使用 Bluebird 的承诺感知迭代方法 -
如何使用
promisifyAll?
标签: javascript node.js mongodb promise bluebird