感谢@bergi的回答。 FWIW。这是输出的一些代码: -
保持1234OK在第二次保护之后
<!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>
否“
注意:这个问题特别询问了.THENable链解除时触发的JS事件。例如,如果有4个事件部分完成并等待刚刚解决的承诺,而前2个事件已完成执行,但新事件先生会尝试然后立即继续。 IIUYC你说这不可能发生,因为所有pending-promise事件在click或setTimeout进入之前作为原子单位完成了吗?但是,当Promise仍未解决时,他们是如何进入的?
如果我有几个不同的事件.THEN等待一个承诺,发行顺序是否保证是FIFO?
为了争论,我会假设答案是肯定的,但更复杂的问题是现在在已经解决的Promise上尝试过的新事件会发生什么?它会立即执行,从而跳过待处理的解决等待者的剩余队列吗?
如果我们需要按顺序处理消息,我担心我们必须在逻辑上单线程访问postMessage之类的promises: - (
例如(下面的一些理由解释代码)如果我想将消息发布给我的服务工作者那么我将必须管理我自己的数组队列,按下我的消息然后“如果myQueueLen == 1 setTimeout(postQueueProcessor, 0)“并且队列处理器事件将调用/触发自己直到空。
这会使承诺变得非常可怕,所以我一定是弄错了。请指教。
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;
}
}
}
只要Javascript Promises支持FIFO解析,上述功能就可以使用,但是其他情况下可能会有新的THEN用新事件进入所有待处理的THEN之前?