当其中一个 promise 被拒绝/解决时,promise.race 不是应该终止所有 promise 吗?
var cancelDeferred = new cancellation()
Promise.race([cancelDeferred.promise, new Promise( (res, req) => {
setTimeout(() =>{
console.log("hey")
}, 2000)
})]).catch(e =>{
console.log(e)
})
setTimeout(() => {cancelDeferred.cancel()}, 500);
function cancellation () {
const token = {};
token.promise = new Promise((_, reject) => {
token.cancel = () => reject(new Error('cancelled'));
});
return token;
}
在此代码中,一个 Promise 在 500 毫秒后被取消,因此应该会导致 .catch 到控制台日志,对吧?
不,它仍然记录“嘿”,这是为什么?
最佳答案
这是正常行为。并不是因为 Promise 被拒绝,setTimeout
才会被取消。 Promise.race
为您提供了一个 Promise,一旦任何给定的 Promise 被拒绝(或者如果所有 Promise 都满足则满足),该 Promise 就会被拒绝。它不会中断任何可能仍在挂起的异步代码。在 Promise.race
返回的 Promise 结算后,它将变得不知道传递给它的任何其他 Promise 的任何结算,但不会阻止异步代码执行.
setTimeout
有自己的“契约”,只有在调用 clearTimeout
时才能打破。任何 promise 拒绝都不能阻止调用 setTimeout
回调。
要使其正常工作,您需要调用clearTimeout
:
var cancelDeferred = cancellation()
var clearDeferred = delay(2000);
Promise.race([cancelDeferred.promise, clearDeferred.promise]).catch(e =>{
console.log("catch", e.message)
clearDeferred.clear();
})
setTimeout(() => {cancelDeferred.cancel()}, 500);
function cancellation () {
const token = {};
token.promise = new Promise((_, reject) => {
token.cancel = () => reject(new Error('cancelled'));
});
return token;
}
function delay(ms) {
const token = {};
token.promise = new Promise((resolve) => {
const timer = setTimeout(() => {
resolve(); // promise makes sense only if there is this call
console.log("hey");
}, ms);
token.clear = () => {
clearTimeout(timer);
console.log("timer cleared");
}
});
return token;
}
关于javascript - Promise.race 在一个 Promise 被拒绝后继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57017668/