Open roxy0724 opened 5 years ago
Promise
、Async/Await
属于 JavaScript 自身拥有的 API, setTimeout
是 Javascript 宿主环境提供的 API(如浏览器或Node.js)setTimeout
用来延时执行代码;Promise
用来解决回调地狱(Callback hell),采用链式调用的方式更为直观;如果觉得链式调用还不够直观,Async/Await
可用同步代码的方式写异步代码。setTimeout
,Promise
、Async/Await
都可以实现异步编程,setTimeout
将回调推入任务队列(Task queue),而 Promise
和Async/Await
将回调推入微任务队列(MicroTask queue)。setTimeout
:用于在指定的毫秒数后调用函数或计算表达式
Promise
: 接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数
Async/Await
: async
是Generator
函数的语法糖,使用async
表示,函数内使用await
来表示异步
setTimeout
为MacroTask
宏任务,Promise
,Async/Await
为MicroTask
微任务。
执行顺序如下图
在浏览器环境中,setTimeout属于macrotasks queue(宏任务队列),Promise、Async/Await属于microtasks queue(微任务队列)。 js事件循环,会先执行微任务队列,再执行宏任务队列。 如在浏览器中:
会先执行promise微任务队列,再执行setTimeout的宏任务队列。 另外,我们可以手动把一个任务加入微任务执行队列中:
执行顺序为3-》4-》queueMicrotask-》1