Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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_Promise - Fatal编程技术网

Javascript 承诺中的同步执行顺序

Javascript 承诺中的同步执行顺序,javascript,promise,Javascript,Promise,我在尝试在事件侦听器中测试承诺时遇到问题。除了执行令,一切都很好 var test=document.querySelector(“#test”); test.addEventListener('click',function(){ Promise.resolve().then(函数()){ 扔“第一”; }).catch(函数(er){ 控制台日志(er); }); }); test.addEventListener('click',function(){ console.log('seco

我在尝试在事件侦听器中测试承诺时遇到问题。除了执行令,一切都很好

var test=document.querySelector(“#test”);
test.addEventListener('click',function(){
Promise.resolve().then(函数()){
扔“第一”;
}).catch(函数(er){
控制台日志(er);
});
});
test.addEventListener('click',function(){
console.log('second');
});
test.click()

第二个侦听器不依赖于第一个侦听器(promise),因此它们异步工作。你为什么把它们分开?您可以简单地使用以下代码

    Promise
        .resolve()
        .then(function(){
            throw 'first';
        })
        .catch(function(er){
            console.log(er);
        })
        .finally(function(er) {
            console.log('second');
        };
    });

根据标准要求,其表现如下:

  • 否则,如果承诺的
    [[PromiseState]]
    内部插槽的值是
    “已完成”

    A.让value为promise的
    [[PromiseResult]]
    内部插槽的值。
    B执行
    排队作业(“PromiseJobs”,PromiseActionJob,«‍完成反应,值»)
  • 否则,如果PromiseState的
    [[PromiseState]]
    内部插槽的值为
    “已拒绝”

    A.让理由成为承诺的
    [[PromiseResult]]
    内部插槽的值。
    B执行
    排队作业(“PromiseJobs”,PromiseActionJob,«‍拒绝反应,原因»)
    因此,当一个承诺被解析或拒绝时,相应的回调将被安排在稍后运行,与当前执行异步

    参考资料:


    然后对其他代码异步调用
    的回调。你说的“完成”是什么意思?@zerkms你怎么知道的?你有什么文件吗?这是一个bug还是预期的行为?@Bergi finish实际上是在执行。它实际上是在标准中:后跟我知道它们是异步执行的。但是,如果
    Promise.then
    是同步的,那么执行顺序应该颠倒。@JaromandaX你没有明白我的意思。事件侦听器显然是异步执行的,但是
    承诺。我这么说是因为我认为最好有一个同步版本的
    Promise。然后
    。我试着理解@Tresdin。好的,我们知道
    Promise.resolve()
    console.log('second')
    是两个异步代码块
    Promise.resolve()
    需要更多的时间来执行,所以这就是为什么首先看到
    console.log('second')
    正在运行的原因。在这种情况下,如果您希望您的
    console.log('second')
    自信地在第一个侦听器之后运行,您必须将其放入
    然后,捕获或最终
    块,这就是我们称之为同步执行:)希望我在@TresdinBig中理解了您的观点感谢规范的解释。我认为异步执行通常应用于长时间运行的操作(I/O、CPU密集型等)。在这种情况下实现它是没有意义的。你知道为什么
    应该承诺。那么
    应该是异步的吗?我知道最初它是这样要求的。我也不确定,但有一种可能性,即内在的承诺只是采用了这种行为。我个人不知道它们是异步的技术原因是什么。从另一方面来说,我确实意识到,即使它们与已经解决/拒绝的承诺同步,你最好还是不要依赖它,因为那样你会有两种不同的行为。因此,最初的想法可能是提供一致的行为。@zerkms:没错,
    然后
    回调会一致(可靠)异步执行。@Tresdin:嗯,如果没有长时间运行的操作,就不应该使用承诺。如果希望它是同步的,则不能使用
    ,然后使用