gpt4 book ai didi

javascript - Promise.race 在一个 Promise 被拒绝后继续运行

转载 作者:行者123 更新时间:2023-12-02 23:19:22 26 4
gpt4 key购买 nike

当其中一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com