假设我使用promise在NodeJS中有以下源代码(连接到mongodb有3个集合,嗯,这并不重要)
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,但我不知道所有推送何时完成。所以我不知道何时解决,将数据返回给用户,例如,通过快递中的response.send。至于上面的代码,当我多次使用resolve时,我只会获得返回的整个数据的一部分。
我可以想出两个解决方法,也不好。一种是在setTimeout中包围所有结果,这意味着我必须将响应延迟到用户。
另一个是计算开始时的所有推送时间,每次按下一个项目时减去1。当时间变为0时,请解决。但在进行真正的循环之前,通常很难计算出数字。
有更好的解决方案吗?谢谢你,爱你:)。
答案 0 :(得分:1)
首先,避免使用Promise
constructor antipattern并使用返回值!对于多层异步函数,只需使用多层promises。要一次等待多个承诺,请使用Promise.all
:
function getData(){
return Promise.all([
getCollection1(),
getCollection2(),
getCollection3()
]).then(([rows1, rows2, rows3]) => {
return [someDataProcessingFunction(rows1, rows2)].concat(rows3);
});
}