Javascript承诺可解析函数发布顺序

Javascript承诺可解析函数发布顺序,javascript,promise,es6-promise,service-worker,Javascript,Promise,Es6 Promise,Service Worker,感谢@bergi的回答。不管好坏下面是一些输出的代码:- KEPT1234OK在Keptinterloperafter 2之后 <!DOCTYPE html> <html> <body> <p id="demo"></p> <script> var keep; var myPromise = new Promise(res => {keep = res;}) var demo = do

感谢@bergi的回答。不管好坏下面是一些输出的代码:-

KEPT1234OK在Keptinterloperafter 2之后

<!DOCTYPE html>
<html>
<body>
  <p id="demo"></p>
  <script>

    var keep;
    var myPromise = new Promise(res => {keep = res;})
    var demo = document.getElementById("demo");

    for (var x=1; x<5; x++){
        setTimeout(function(){
            var myId = x;
            return function()
                        {
                            myPromise.then(()=>{
                                    demo.innerHTML += myId;
                                    if (myId == 2) {
                                        setTimeout(function(){demo.innerHTML += "after 2nd"},0);
                                        myPromise.then(()=>{demo.innerHTML += "OK"})
                                    }
                                    });
                        }
            }(),x*500);                
}

wait(3000).then(()=>{
    keep();
    demo.innerHTML += "Kept";
    setTimeout(function(){demo.innerHTML += "After Kept";
    myPromise.then(()=>{demo.innerHTML += "interloper"})  },0)
    });

function wait(time) {
    return new Promise(resolve => 
        {
            setTimeout(resolve, time)
        });
}
</script>
</body>
</html>

只要Javascript承诺支持FIFO解析,上述操作就可以正常工作,但在其他情况下,在满足所有挂起的事件之前,可能会有新的事件出现?

多个
。然后()按照FIFO顺序执行同一承诺上的
处理程序。老实说,我不明白你的问题的其余部分是什么,也不知道你在做什么。谢谢你的快速回复@谢谢,这回答了第一部分。mplungjan非常类似,IIUC告诉我,一个“新的”然后在一个已解决的承诺上将立即在线执行,所以伙计们这一切都说我们必须用可控的JS实现我们自己的消息队列“事件块事件,无延迟,无承诺”事件,或者不能保证FIFO?我是否清楚地表达了我的观点/担忧?这太可怕了:-(更好的措辞:-“是不是对同一承诺上的.then()处理程序的处理/耗尽以原子方式执行?”我开始认为答案绝对不可能是“是”):-(@McMurphy是的,当然是,所有异步JS都是原子的。没有两个回调同时运行。“现在尝试在已解析的承诺上执行的新事件会发生什么情况?它会立即执行吗?”否,所有承诺
然后
回调始终异步执行,即排队等待以后执行
    var fireTravelEvent = 
    function(msg,callback)
    {
        try {
            currActive.postMessage(msg);
            console.log("Msg Sent to SW");
            if (callback) callback();
        } catch (e) {
            if (e.name == "InvalidStateError" || e.name == "TypeError") {
                navigator.serviceWorker.ready
                .then(reg => {
                        currActive = reg.active;
                        fireTravelEvent(msg, callback)})
            } else {
                throw e;
            }
        }
    }