Javascript承诺可解析函数发布顺序
感谢@bergi的回答。不管好坏下面是一些输出的代码:- KEPT1234OK在Keptinterloperafter 2之后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
<!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;
}
}
}