我正在使用bluebird
作为我的Promise
libaray。我有以下链:
function a() {
return Promise.all([promise1, promise2]).then((results) => {
return promise3(results)
})
}
但是我无法得到promise3
的结果,我的意思是以下不起作用:
a().then((result) => {
console.log(result)
}).catch((err) => {
console.error(err)
})
我搜索并阅读了有关承诺但我无法理解问题出在哪里?
答案 0 :(得分:7)
这可能有几个原因,无法确定帖子中的哪一个。所以为了帮助未来的读者 - 让我们弄清楚在上面的场景中会出现什么问题:
让我们对代码进行以下调整:
function a() {
console.log("a called"); // if this doesn't log, you're redefining 'a'
return Promise.all([promise1, promise2]).then((results) => {
console.log("In .all"); // if this isn't called, promise1 or promise2 never resolve
return promise3(results);
}).tap(() =>
console.log("Promise 3 fn resolved") // if this doesn't log, promise3 never resolves
});
}
然后,我们的then
处理程序:
let r = a().then((result) => {
console.log('result', result); // this logs together with promise 3 fn
}); // bluebird automatically adds a `.catch` handler and emits unhandledRejection
setTimeout(() => {
// see what `r` is after 30 seconds, if it's pending the operation is stuck
console.log("r is", r.inspect());
}, 30000);
这应该让你全面覆盖可能出错的所有案例。
如果我不得不猜测 - 其中一个承诺永远无法解决,因为你的某个Promise
构造函数永远不会调用resolve
或reject
。
(Bluebird会在某些情况下警告你不要这样做 - 确保你有警告)
可能导致这种情况的另一种情况是取消 - 但我假设你没有打开它。
快乐的编码。