假设我在 NodeJS 中使用 Promise 有以下源代码(使用 3 个集合连接到 mongodb,嗯,这并不重要)
function getData(){
return new promise((resolve, reject) => {
var dataArray = [];
getCollection1().then((rows1) => {
getCollection2().then((rows2) => {
var val = someDataProcessingFunction(rows1, rows2);
dataArray.push(val);
resolve(dataArray);
}, (err) => {
reject(err);
}
}, (err) => {
reject(err);
});
getCollection3().then((rows3) => {
rows3.forEach((row3) => {
dataArray.push(row3);
});
resolve(dataArray);
}, (err) => {
reject(err);
});
});
}
问题是,有多个地方推送了dataArray,但我不知道什么时候所有推送完成。这样我不知道何时解析,将数据返回给用户,例如通过express中的response.send。对于上面的代码,当我多次使用resolve时,我只会得到返回的全部数据的一部分。
我可以想出两种解决方法,但都不好。一是把所有的解析都放在setTimeout中,这意味着我必须延迟对用户的响应。
还有一种是一开始就统计所有的推送次数,每次推送一项就减1。当时间变为0时,做决定。但在进行真正的循环之前通常很难计算出这个数字。
有更好的解决方案吗?谢谢你并爱你:)
最佳答案
首先,避免 Promise
constructor antipattern并使用返回值代替!对于多层异步函数,只需使用多层 Promise 即可。要一次等待多个 promise ,请使用 Promise.all
:
function getData(){
return Promise.all([
getCollection1(),
getCollection2(),
getCollection3()
]).then(([rows1, rows2, rows3]) => {
return [someDataProcessingFunction(rows1, rows2)].concat(rows3);
});
}
关于node.js - NodeJS中promise如何通过多层回调解析所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46059338/