异步编程的实现方式:
- 回调函数;
- Promise
- Generator
- async / await
Promise
解析:console.log('script start') // 1
let promise1 = new Promise(function (resolve) {
console.log('promise1') // 2
resolve()
console.log('promise1 end') // 3 这个地方为什么比 4 先打印,还是不太明白,需注意
}).then(function () {
console.log('promise2') // 5
})
setTimeout(function(){
console.log('settimeout') // 6
})
console.log('script end') // 4
// 输出顺序: script start->promise1->promise1 end->script end->promise2->settimeout
promise1.then()
的回调是一个task
;promise1
是resolve
或rejected
时,那这个task
会被放入当前事件的microtask queue
(微任务队列)中;promise1
是pending
时,这个task
会被放入事件循环未来的某个(可能是下一个)回合的microtask queue
(微任务)中;setTimeout
的回调也是一个task
,它会被放入macrotask queue
(宏任务队列)中,即使是0ms
。Generator
async / await
async function async1(){
console.log('async1 start'); // 2
await async2(); // 可看成 Promise().then()
console.log('async1 end') // 5
}
async function async2(){
console.log('async2') // 3
}
console.log('script start'); // 1
async1();
console.log('script end') // 4
// 输出顺序:script start->async1 start->async2->script end->async1 end