相关疑难解决方法(0)

在javascript承诺中执行的顺序是什么

我想向自己解释下面使用javascript promises的代码片段的执行顺序.

Promise.resolve('A')
  .then(function(a){console.log(2, a); return 'B';})
  .then(function(a){
     Promise.resolve('C')
       .then(function(a){console.log(7, a);})
       .then(function(a){console.log(8, a);});
     console.log(3, a);
     return a;})
  .then(function(a){
     Promise.resolve('D')
       .then(function(a){console.log(9, a);})
       .then(function(a){console.log(10, a);});
     console.log(4, a);})
  .then(function(a){
     console.log(5, a);});
console.log(1);
setTimeout(function(){console.log(6)},0);
Run Code Online (Sandbox Code Playgroud)

结果是:

1
2 "A"
3 "B"
7 "C"
4 "B"
8 undefined
9 "D"
5 undefined
10 undefined
6
Run Code Online (Sandbox Code Playgroud)

我很好奇执行顺序1 2 3 7 ...而不是值'A','B'......

我的理解是,如果一个promise得到解决,'then'函数将被放入浏览器事件队列中.所以我的期望是1 2 3 4 ......


@ jfriend00谢谢,非常感谢您的详细解释!这真是一项巨大的工作!

javascript promise es6-promise

30
推荐指数
1
解决办法
1万
查看次数

为什么setTimeout最后有0秒完成

所以我想出了这个例子,我无法理解为什么带有0秒的setTimeout是最后一个要执行的

function waitThreeSeconds() {
  setTimeout(function() {
    console.log("Finished Function");
  }, 0);
}

function clickHandler() {
  console.log("Clicked");
}

document.addEventListener('click', clickHandler);

waitThreeSeconds();

//waiting 5 seconds 
var ms = 5000 + new Date().getTime();
while (new Date() < ms) {}


console.log('Finished Execution');
Run Code Online (Sandbox Code Playgroud)

如果将setTimeouts回调添加到队列中,为什么每次我执行click事件时,它都会先添加到队列中,然后再添加到setTimeout的回调中.直到全局执行上下文('main')从堆栈中弹出

javascript asynchronous synchronous

5
推荐指数
1
解决办法
126
查看次数