首页 > 解决方案 > 拒绝和终止对外部事件的承诺

问题描述

如果发生外部事件,我希望能够拒绝并阻止其余的承诺运行。这是示例用例:

new Promise((resolve,reject)=>{
    websocket.onerror=reject;
    //do processing here
    websocket.onerror=undefined;
    resolve(...);
});

如果在 Promise 运行时发生错误,这具有拒绝 Promise 的预期效果。然而,问题是即使发生拒绝,其余的承诺也会继续运行。

使用上面的 async/await 根本不可能。

我认为一种方法是将每一行代码放在一个单独的承诺中,并取消事件链,但这会很痛苦。

标签: javascriptasynchronouspromise

解决方案


然而,问题是即使发生拒绝,其余的承诺也会继续运行。

这是一个基本的误解(你并不孤单!)。没有“承诺的其余部分”。Promise 只是一种观察异步过程完成情况的方法。是过程,而不是承诺,在继续。

如何取消该过程(以及是否可以)完全取决于该过程是什么以及它是否提供了取消它的方法,这与 Promise 本身无关。您似乎正在使用网络套接字,因此您需要使用网络套接字 API 来取消您所做的一切(或向另一端发送消息以告诉它停止正在执行的操作)。

例如:假设 Promise 正在等待计时器 ( setTimeout) 触发,并且会在它触发时解析。然后发生了一些其他的事情,你不再想要那个。拒绝承诺只是拒绝承诺,它对计时器没有任何影响。您也需要取消计时器 ( clearTimeout)。


重新编辑:

我认为一种方法是将每一行代码放在一个单独的承诺中,并取消事件链,但这会很痛苦。

不,promise executor(你传递的函数)中的代码是同步new Promise运行的。同样,没有“其余代码”可以取消。那里可能有异步回调,或者代码启动的过程也需要发送取消,但这并不需要将每一行都放在自己的承诺中,根本不需要。


推荐阅读