异步加载与setTimeout执行顺序
const promise = new Promise(function(resolve, reject) {
// ... some code
if (true){
resolve(value);
} else {
reject(error);
}
});
console.log(1);
setTimeout(function(){
console.log(4);
},100),
setTimeout(function(){
console.log(2);
})
promise.then(function(value) {
console.log(5);
}, function(error) {
console.log(6);
});
console.log(3);
执行到setTimeout函数时,将其回调函数加入队列(此队列与promise队列不是同一个队列,执行的优先级低于promise)。继续执行
创建promise对象里面的代码属于同步代码,promise的异步性体现在then与catch处,所以promise1被输出,然后将then函数的代码加入队列,继续执行同步代码,输出script end。
至此同步代码执行完毕,开始从队列中调取任务执行,由于刚刚提到过,setTimeout的任务队列优先级低于promise队列,所以首先执行promise队列的第一个任务,即执行async1中await后面的代码,输出async1 end。
然后执行then方法的部分,输出promise2。最后promise队列中任务执行完毕,再执行setTimeout的任务队列,输出settimeout。
至此,该题的输出结果分析完毕了,这类的执行结果可以用一句话总结,先执行同步代码,遇到异步代码就先加入队列,然后按入队的顺序执行异步代码,最后执行setTimeout队列的代码。
补充一下队列任务优先级:promise.Trick()>promise的回调>setTimeout>setImmediate