关于异步执行顺序
知道由于异步,一下代码会生产5个5
1 for (var i = 0; i < 5; i++) { 2 setTimeout(function() { 3 console.log(i); 4 }, 1000 * i); 5 }
我们可以通过创建块级作用域的方式保存当前变量。
然而如果有Promise参与呢?
1 setTimeout(function() { 2 console.log(1) 3 }, 0); 4 new Promise(function executor(resolve) { 5 console.log(2); 6 for( var i=0 ; i<10000 ; i++ ) { 7 i == 9999 && resolve(); 8 } 9 console.log(3); 10 }).then(function() { 11 console.log(4); 12 }); 13 console.log(5);
这个有点复杂了。大体可以猜出是235(41)(14)。到底是哪个?
答案是4在1前面,是这么解释的。
“Promise 的 4 在 1 前面输出是因为 Promise.then()里面的回调属于 microtask, 会在当前 Event Loop 的最后执行, 而 SetTimeout 内的回调属于 macrotask, 会在下一个 Event Loop 中执行”。
大开眼界,还是要好好学习一个啊。好好看看microtask内容才能领会异步的真正含义。