将 Promise 与 CouchDB nano 和 forEach 结合使用



我需要帮助来调试这段代码/或学习有效的方法 - 我尝试使用 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 ====> [ ]
    

我看到这是异步性的问题,但我似乎无法弄清楚如何实际完成这项工作。 任何投入或资源将不胜感激!

如果我不正确,我实际上还没有运行您的代码,很抱歉,但是从查看它和蓝鸟文档来看,我认为您需要进行的更正是返回您的 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方法在纳米.db返回数据之前触发。

我把你的纳米.db的召唤包装在一个承诺中,这样它就可以等待纳米.db完成,因为Promise.each支持在其中返回承诺。

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

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

因此,如果 promise 没有在您的Promise.each中返回,并且任何异步的事情都发生在内部,那么就像在相同情况下对 promise 使用thencatch方法一样。

由于我不知道蓝鸟,可能有一种方法可以改变这种承诺,使其更像蓝鸟。我围绕nano.db调用包装的承诺只是一个普通的 es6 承诺,蓝鸟可能有也可能没有不同的 API 来创建承诺。

最新更新