要理解Promise的执行原理,首先要知道EMCAScript的任务队列机制——macro-task(宏任务)和micro-task(微任务)。
浏览器先执行一个macrotask,在执行macrotask过程中可能会创建新的macrotask和microtask,然后顺序执行micro-task队列中的全部任务,然后再取出一个macrotask执行……周而复始。整个script代码是一个macrotask,setTimeout会产生一个新的macrotask,Promise对象调用到resolve时会创建一个microtask。想要更细节的理解,传送门Promise的队列与setTimeout的队列有何关联?
下面介绍Promise中resolve的调用机制。
function wash(resolve){
console.log('开始洗衣服...');
setTimeout(()=>{
console.log('洗完了!');
resolve('一堆洗干净的衣服');
}, 2000);
}
function hang(clothes){
console.log('开始晾衣服...');
/*...晾衣服中...*/
console.log(clothes+'晾好了!');
return '一堆晾好的衣服';
}
function dry(clothes){
console.log('