javascript - 拒绝和终止对外部事件的承诺
问题描述
如果发生外部事件,我希望能够拒绝并阻止其余的承诺运行。这是示例用例:
new Promise((resolve,reject)=>{
websocket.onerror=reject;
//do processing here
websocket.onerror=undefined;
resolve(...);
});
如果在 Promise 运行时发生错误,这具有拒绝 Promise 的预期效果。然而,问题是即使发生拒绝,其余的承诺也会继续运行。
使用上面的 async/await 根本不可能。
我认为一种方法是将每一行代码放在一个单独的承诺中,并取消事件链,但这会很痛苦。
解决方案
然而,问题是即使发生拒绝,其余的承诺也会继续运行。
这是一个基本的误解(你并不孤单!)。没有“承诺的其余部分”。Promise 只是一种观察异步过程完成情况的方法。是过程,而不是承诺,在继续。
如何取消该过程(以及是否可以)完全取决于该过程是什么以及它是否提供了取消它的方法,这与 Promise 本身无关。您似乎正在使用网络套接字,因此您需要使用网络套接字 API 来取消您所做的一切(或向另一端发送消息以告诉它停止正在执行的操作)。
例如:假设 Promise 正在等待计时器 ( setTimeout
) 触发,并且会在它触发时解析。然后发生了一些其他的事情,你不再想要那个。拒绝承诺只是拒绝承诺,它对计时器没有任何影响。您也需要取消计时器 ( clearTimeout
)。
重新编辑:
我认为一种方法是将每一行代码放在一个单独的承诺中,并取消事件链,但这会很痛苦。
不,promise executor(你传递的函数)中的代码是同步new Promise
运行的。同样,没有“其余代码”可以取消。那里可能有异步回调,或者代码启动的过程也需要发送取消,但这并不需要将每一行都放在自己的承诺中,根本不需要。
推荐阅读
- javascript - 真的需要另一双眼睛看一些 JavaScript 代码
- python - 修复 QTreeWidget 上的选定项目突出显示
- amazon-web-services - 使用 cloudformation 在 Apache 上安装证书
- swift - .font 不能转换为 .font
- hana - 将 HANA 数据库从版本 1.00.122.19.1534210989 升级到 2.00.037.01.1557479495 后,正则表达式不起作用
- python - 为什么使用基本 NumPy 切片无法正确裁剪我的图像?
- cordova - 为什么在 Android 上显示 admob 横幅后,后退按钮停止在我的 Phonegap 应用上工作?
- javascript - 仅从 xml 文件中检索名称并将它们放入 JavaScript 中的数组中
- haskell - 在实现 EitherT 变态时,我在哪里引入了额外的一元结构?
- c++ - 如何修复最小堆插入/提取函数中的错误?