Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 拒绝并终止对外部事件的承诺_Javascript_Asynchronous_Promise - Fatal编程技术网

Javascript 拒绝并终止对外部事件的承诺

Javascript 拒绝并终止对外部事件的承诺,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,如果发生外部事件,我希望能够拒绝并阻止承诺的其余部分运行。这是一个示例用例: new Promise((resolve,reject)=>{ websocket.onerror=reject; //do processing here websocket.onerror=undefined; resolve(...); }); 如果在承诺运行过程中发生错误,这将产生拒绝承诺的预期效果。然而,问题是,即使发生拒绝,承诺的其余部分仍将继续运行 使用async/

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

new Promise((resolve,reject)=>{
    websocket.onerror=reject;
    //do processing here
    websocket.onerror=undefined;
    resolve(...);
});
如果在承诺运行过程中发生错误,这将产生拒绝承诺的预期效果。然而,问题是,即使发生拒绝,承诺的其余部分仍将继续运行

使用async/await进行上述操作是完全不可能的

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

然而,问题是,即使发生拒绝,承诺的其余部分仍将继续运行

这是一个基本的误解(并不是只有你一个人在其中!)。没有“承诺的其余部分”。承诺只是观察异步过程完成的一种手段。这是一个持续的过程,而不是承诺

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

例如:假设承诺正在等待一个计时器(
setTimeout
)启动,并在启动时解析。然后另一件事发生了,你不再想要它了。拒绝承诺就是拒绝承诺,这对计时器没有任何影响。您还需要取消计时器(
clearTimeout


重新编辑:

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


否,承诺执行器中的代码(您传递的函数
new promise
)是同步运行的。同样,没有“代码的其余部分”可以取消。这里可能有异步回调,或者代码启动的过程也需要发送取消,但这并不需要每一行都有自己的承诺,一点也不需要。

了解答案可能会帮助您:

创建承诺时,它将同步执行。因此,执行这一行:

websocket.onerror=reject;
此时,代码开始处理。如果有websocket错误事件,它将被放入js事件循环中,但您的承诺仍在同步执行。然后您解开websocket的错误处理程序,并解决。即使有错误,承诺也会解决。此时,resolve调用也被添加到js的事件循环中。然后执行下一个js勾号,可能会调用reject,可能不会,但这并不重要,因为您是同步解决的,承诺在解决或拒绝后不会改变主意

所以这里的关键是创建一个承诺是同步执行的。它不是一个线程,您可以在等待其他事件时取消它。承诺的解决或拒绝是异步执行的,但这对您毫无帮助

要取消承诺,你需要一些基本的东西,比如

if(someOtherVariableThatDeterminesCancelation){
  reject()
}

因此,当同步代码正在运行时,事件将永远不会触发?@sunny lan-事件可能会触发,但它的回调将位于作业队列中,直到当前作业(在promise executor中运行同步代码)完成。现在把它添加到这个问题中已经太迟了,但是如果你不确定要取消什么或者在你的真实代码中的什么地方,我建议发布一个新的问题,其中包含一段代码,显示你正在做的实际事情,这样人们可以帮助你知道需要取消哪些内容(如果有的话)。