假设我有使用承诺的NodeJS下面的源代码(连接3件藏品MongoDB的,好了,这并不重要)怎样才能保证解决与回调的多个层中的所有数据的NodeJS
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以express方式。至于上面的代码,当我使用多次解析时,我只会得到部分返回的数据。
我能想出两种解决方法,既不好。一个是围绕setTimeout中的所有解析,这意味着我必须延迟对用户的响应。
另一种方法是在开始时计算所有的推送时间,每次按一个项目时减1。当时间为0时,解决问题。但在进行实际循环之前往往难以计算数字。
有没有更好的解决方案?谢谢你,爱你:)
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all –
注意'then'回调只执行一次,所以我不明白为什么你有'dataArray',因为你只会推两次。 – trincot
同样,你不能两次解决承诺。第二次调用'resolve'将不起作用。 – trincot