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

标签 javascript promise cancellation

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

相关文章:

javascript - Q promises - 数组中每个元素的 Node.js 函数

c# - 在没有 CancellationToken 的情况下停止任务

javascript - 如何在 Node 中调试基于 promise 的代码?

javascript - 调用一个获取 API 并呈现返回值的函数,Promises 出现问题

c# - 如何使用 CancellationToken 属性?

node.js - bramqp 和 node.js : Error on cancelling consumer (basic. 取消)

javascript - ionic 3 HTTP-GET 连接输入用户名和密码以访问 php 页面

javascript - react-native 链接给出错误 no such file or directory info.plist

javascript - 如何根据前一个复选框显示一组复选框

javascript - 我们如何在 AmCharts4 中使用图例作为过滤器?