我需要帮助调试这段代码/或者学习有效的方法 - 我尝试使用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 ====> [ ]
我认为这是异步性问题,但我似乎无法弄清楚如何实现这项工作。任何输入或资源将不胜感激!
答案 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.each
或then
方法一样
因为我不知道蓝鸟,所以可能有办法改变那种更像蓝鸟的承诺。我绕过catch
电话的承诺只是一个正常的es6承诺,蓝鸟可能会或者可能没有用于创建承诺的不同api。