node.js - 将 Promise 与 CouchDB nano 和 forEach 结合使用

标签 node.js promise couchdb bluebird couchdb-nano

我需要帮助调试此代码/或学习有效的方法来执行此操作 - 我尝试使用 bluebird.each 捕获 forEach 中的所有执行,但没有成功。与使用纯 JavaScript 设置新的 Promise 相同。我需要帮助如何首先执行我的 forEach 并继续。

let arr = []; 
let fields = ['environment', 'habitat', 'earth]
Promise.each(fields, field => {
  nano.db.use(field).view('options', 'options')
    .spread((body, header) => {
      arr.push(body.rows);
  })
}).then(() => console.log(arr))
  • 预期结果:

    arr to console.log ====> [1,2,3,4,5]
    
  • 实际结果:

    arr is an empty array ====> [ ]
    

我发现这是异步性的问题,但我似乎无法弄清楚如何真正实现这项工作。任何意见或资源将不胜感激!

最佳答案

我实际上并没有运行你的代码,如果我不正确的话,很抱歉,但是从查看它和 bluebird 文档来看,我认为你需要进行的更正是返回包含在 Promise.each 内的 promise 中的 nano.db 调用

let arr = []; 
let fields = ['environment', 'habitat', 'earth']
Promise.each(fields, field => {
  return new Promise ((resolve, reject) => {
    nano.db.use(field).view('options', 'options')
      .spread((body, header) => {
        arr.push(body.rows);
        resolve();
      })
  });
}).then(() => console.log(arr))

我相信您的假设是正确的,即在返回空数组而不是您期望的值时,您遇到了异步问题。我假设 .then 方法在 nano.db 返回数据之前触发。

我将您对 nano.db 的调用包装在一个 Promise 中,以便它将等待 nano.db 完成,因为 Promise.each 支持在其中返回 Promise。

Bluebird 的 promise 文档声明为 Promise.each .

If the iterator function returns a promise or a thenable, then the result of the promise is awaited before continuing with next iteration.

因此,如果您的 Promise.each 中没有返回 Promise,并且 then 内部发生了任何异步操作,就像在相同情况下 Promise 上的 thencatch 方法一样。

由于我不了解 Bluebird ,可能有一种方法可以改变这个 promise ,使其更像 Bluebird 。我围绕 nano.db 调用封装的 Promise 只是一个普通的 es6 Promise,bluebird 可能有也可能没有不同的 api 来创建 Promise。

关于node.js - 将 Promise 与 CouchDB nano 和 forEach 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43288625/

相关文章:

javascript - 扩展 jQuery 的 Promise 对象中的 did()

node.js - 在q(promise)中,无法读取未定义的属性 'apply'?

powershell - CouchDB SSL CRT 到 PEM 文件

couchdb - 通过更新处理程序向 couchDB 提交表单不起作用

node.js - 已发送空白 html 电子邮件

javascript - 如何构建 sails.js 离线文档?

node.js - 如何获取后端发送的前端paypal结账链接

javascript - 如何取消javascript中的 promise ?

node.js - CouchDB 和 Node.js - 你推荐什么模块?

node.js - Webdriver不稳定,运行时有时会崩溃