承诺的MongoDB节点驱动程序.forEach()返回什么样的承诺?

时间:2016-07-31 15:58:28

标签: javascript node.js mongodb promise bluebird

我最近在Node.js项目中开始使用arrow函数,promises(bluebird)和MongoDB。正如您在下面看到的,我宣传了所有mongodb本机驱动程序。到目前为止,工作就像一个魅力。

现在,我想使用.forEach()方法,我想知道如何使用它。这是一个想法:

Padding is invalid and cannot be removed.

我的问题是:

  1. promisified .forEach()返回什么?这是一个承诺,一旦所有文件都更新后将得到解决吗?
  2. 如果我的代码不起作用,有关如何正确实现它的任何想法吗?
  3. [可选的问题对我有很大帮助:]

    1. 我注意到MongoDB驱动程序中的.each()方法。它被标记为“已弃用”,但它是否有用,或者我应该坚持.forEach()?
    2. 整个片段对您有意义,还是我应该注意哪些新手错误/改进?
    3. 非常感谢您的回答或建议!

      [编辑:我预先更新了。我觉得我再次回调地狱了。]

1 个答案:

答案 0 :(得分:1)

你不需要任何蓝鸟。 mongo驱动程序已经建立了承诺。由于forEach不会返回任何内容,因此您可以使用map()将每个文档更新处理为一个承诺,使用toArray()将它们减少为一组承诺,然后{{1}解析该数组中的每个promise:

Promise.all()
  

我注意到MongoDB驱动程序中的.each()方法。它被标记为“已弃用”,但它是否有用,或者我应该坚持.forEach()?

我认为var mongodb = require("mongodb"); var MongoClient = mongodb.MongoClient; MongoClient .connect('the_URL_of_my_database') .then((db) => { var myCollection = db.collection('my_collection'); myCollection.find({}) .map((document) => { var selector = { _id: document._id }; var update = { $set: { data: 'my_new_data' } }; return myCollection .updateOne(selector, update) .then((response) => { // this is each resolved updateOne. You don't need // this `.then` unless you want to post-process // each individual resolved updateOne result console.log(response.result); // return each value to accumulate it in Promise.all.then() return response.result; }); }) .toArray() // accumulate the .map returned promises .then((promises) => Promise.all(promises)) // iterate through and resolve each updateOne promise .then((resolvedPromises) => { // an array of all the results returned from each updateOne console.log(resolvedPromises); }) .catch((error) => { // error handle the entire chain. }); }) .catch((error) => { // error handle the connection }); 已被弃用,而.each().forEach()原型保持一致。