在里面返回一个承诺然后不起作用
returning a promise inside then doesn't work
我正在使用 bluebird
作为我的 Promise
库。我有以下链:
function a() {
return Promise.all([promise1, promise2]).then((results) => {
return promise3(results)
})
}
但我无法得到 promise3
的结果,我的意思是以下内容不起作用:
a().then((result) => {
console.log(result)
}).catch((err) => {
console.error(err)
})
我搜索并阅读了有关 promises 的内容,但我不明白问题出在哪里?
这可能有多种原因,无法从 post 中确定是哪一个。因此,为了帮助未来的读者 - 让我们找出在上述情况下可能出现的问题:
让我们对代码进行以下调整:
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);
这应该可以全面覆盖所有可能出错的情况。
如果我不得不猜测 - 其中一个承诺永远不会解决,因为您在某个地方有一个永远不会调用 resolve
或 reject
的 Promise
构造函数。
(Bluebird 会在某些情况下警告您 - 确保您已打开警告)
另一种可能导致这种情况的情况是取消 - 但我假设您没有打开它。
编码愉快。
我正在使用 bluebird
作为我的 Promise
库。我有以下链:
function a() {
return Promise.all([promise1, promise2]).then((results) => {
return promise3(results)
})
}
但我无法得到 promise3
的结果,我的意思是以下内容不起作用:
a().then((result) => {
console.log(result)
}).catch((err) => {
console.error(err)
})
我搜索并阅读了有关 promises 的内容,但我不明白问题出在哪里?
这可能有多种原因,无法从 post 中确定是哪一个。因此,为了帮助未来的读者 - 让我们找出在上述情况下可能出现的问题:
让我们对代码进行以下调整:
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);
这应该可以全面覆盖所有可能出错的情况。
如果我不得不猜测 - 其中一个承诺永远不会解决,因为您在某个地方有一个永远不会调用 resolve
或 reject
的 Promise
构造函数。
(Bluebird 会在某些情况下警告您 - 确保您已打开警告)
另一种可能导致这种情况的情况是取消 - 但我假设您没有打开它。
编码愉快。