Promise是ES6中提出的解决异步编程导致的陷入回调地狱问题的方案,而且,promise本身是同步的,但是,.then()和.catch()是异步的。
let a=new Promise((res,rej)=>{
console.log(1);
res(2);
})
a.then(res=>{
console.log(3);
console.log(res);
})
console.log(4);
结果如下:
重点:在promise中,如果调用了res()或者rej(),这个并不影响后续代码的执行的,因为promise是同步的,但是呢,在.then/.catch中的代码是异步的,会放到任务队列最后才执行。
也就是说,先执行完同步任务promise之后,then/catch中的代码会等到其他的同步任务执行完了之后才执行。
setTimeout(()=>{
console.log(1)
},0)
new Promise((res,rej)=>{
res();
console.log(2)
}).then(()=>{
console.log(3)
}).catch(()=>{
console.log(4)
})
console.log(5);
因为setTimeout输入异步任务中的宏任务,等于在排队时重新排了,因此它的执行顺序就从原来的位置变成了最后执行
至于promise中的2先输出,那是因为它属于同步任务
但是,promise之后的then却是异步任务中的微任务,因此,它的执行顺序就比最后的那句console.log(5)后面了一些,但由于then和catch都是微任务,微任务的执行优先级比宏任务高了一些,因此,先执行完then之后才去执行setTimeout。