1

我需要帮助调试此代码/或学习有效的方法 - 我尝试使用 bluebird.each 来捕获我的 forEach 中的所有执行,但没有得到它的工作。与使用纯 JavaScript 设置新承诺相同。我需要帮助如何执行我的 forEach FIRST 并继续前进。

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 ====> [ ]
    

我认为这是异步性的问题,但我似乎无法弄清楚如何真正做到这一点。任何输入或资源将不胜感激!

4

1 回答 1

0

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

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.each 声明

如果迭代器函数返回一个 promise 或 thenable,则在继续下一次迭代之前等待 promise 的结果。

因此,如果您的 promise 没有返回Promise.each并且内部发生任何异步操作,那么就像在相同情况下使用 promise 上的athen或方法一样。catch

由于我不知道蓝鸟,可能有一种方法可以改变这个承诺,使其更像蓝鸟。我在电话中包裹的承诺nano.db只是一个普通的 es6 承诺,蓝鸟可能有也可能没有不同的 api 来创建承诺。

于 2017-04-08T07:06:01.487 回答