我需要帮助调试此代码/或学习有效的方法来执行此操作 - 我尝试使用 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 上的 then
或 catch
方法一样。
由于我不了解 Bluebird ,可能有一种方法可以改变这个 promise ,使其更像 Bluebird 。我围绕 nano.db
调用封装的 Promise 只是一个普通的 es6 Promise,bluebird 可能有也可能没有不同的 api 来创建 Promise。
关于node.js - 将 Promise 与 CouchDB nano 和 forEach 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43288625/