使用Promise和CouchDB nano&的forEach

时间:2017-04-07 23:49:40

标签: node.js promise couchdb bluebird couchdb-nano

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

我认为这是异步性问题,但我似乎无法弄清楚如何实现这项工作。任何输入或资源将不胜感激!

1 个答案:

答案 0 :(得分:0)

我实际上并没有运行你的代码,所以如果我不正确,请对不起,但是从查看它和蓝鸟文档我认为你需要做的修正是返回你的nano.db调用包裹在{ {1}}

Promise.each

我相信你的假设是正确的,当你得到一个空阵列而不是你期望的时候,你遇到异步性问题。我假设在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)) 方法正在触发。

我将nano.db的调用包含在一个承诺中,以便它等待nano.db完成,因为.then支持在其中返回承诺。

Bluebird的承诺文档以Promise.each表示。

  

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

所以,如果你的Promise.each中没有返回一个promise,那么异步的任何内容都会发生在那里,就像在相同情况下对一个承诺的Promise.eachthen方法一样

因为我不知道蓝鸟,所以可能有办法改变那种更像蓝鸟的承诺。我绕过catch电话的承诺只是一个正常的es6承诺,蓝鸟可能会或者可能没有用于创建承诺的不同api。