1、setTimeout与console.log、promise.then、await之间执行先后顺序
(1)setTimeout延时为0时:
setTimeout(function(){
console.log(2);
},0);
console.log(1);
//输出顺序:1,2
(2)先后顺序:函数调用栈 ——>setTimeout操作(按时延长短)
setTimeout定义的操作,都将放在同一个队列中依次执行。而这个队列的执行时间需要等到函数调用栈执行完毕后才会执行,也就是等待所有的可执行代码执行完毕,才会轮到setTimeout执行其内部操作,并且按照其时延时间长短顺序执行代码!
setTimeout(function(){ //依次输出:undefined 4 3 1 5 2
console.log(a); //第四个:1
},0);
var a = 1;
console.log(b); //第一个:undefined
var b = 2;
var c = 3;
var d = 4;
var e = 5;
function fx(c){
console.log(c); //第三个:3
}
function fn(e,d){
console.log(d); //第二个:4
setTimeout(function(){
console.log(e); //第五个:5
},10);
}
setTimeout(function(){
console.log(b); //第六个:2
},20);
fn(e,d);
fx(c);
(3)关于setTimeout和Promise执行顺序问题 (参考博客:http://www.cnblogs.com/sunmarvell/p/9564815.html)
执行顺序:Promise——>其后的.then()——>setTimeout(异步)
console.log('打印'+1); //第一个:打印1
setTimeout(function(){
console.log('打印'+2); //第六个:打印2
})
new Promise(function(resolve,reject){
console.log('打印'+3); //第二个:打印3
}).then(
console.log('打印'+4)); //第三个:打印4
console.log('打印'+10); //第四个:打印10
new Promise(function(resolve,reject){
setTimeout(function () {
console.log('打印'+5); //第七个:打印5
});
}).then(
console.log('打印'+6)); //第五个:打印6
setTimeout(function(){
new Promise(function(resolve,reject){
console.log('打印'+7); //第七个:打印7
});
})
导图要表达的内容用文字来表述的话:
- 同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。
- 当指定的事情完成时,Event Table会将这个函数移入Event Queue。
- 主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。
- 上述过程会不断重复,也就是常说的Event Loop(事件循环)。