异步编程的实现方式:
- 回调函数;
- Promise
- Generator
- async / await
Promise
解析:console.log('script start') // 1let promise1 = new Promise(function (resolve) {console.log('promise1') // 2resolve()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'); // 2await async2(); // 可看成 Promise().then()console.log('async1 end') // 5}async function async2(){console.log('async2') // 3}console.log('script start'); // 1async1();console.log('script end') // 4// 输出顺序:script start->async1 start->async2->script end->async1 end
