promise

250 阅读2分钟

event loop 它的执行顺序:

一开始整个脚本作为一个宏任务执行, 执行过程中同步代码直接执行,宏任务进入宏任务队列,微任务进入微任务队列 当前宏任务执行完出队,检查微任务列表,有则依次执行,直到全部执行完 执行浏览器UI线程的渲染工作 检查是否有 Web Worker 任务,有则执行 执行完本轮的宏任务,回到2,依此循环,直到宏任务和微任务队列都为空

微任务包括:MutationObserver、Promise.then()或reject()、Promise为基础开发的其它技术,比如fetch API、V8的垃圾回收过程、Node独有的process.nextTick。

宏任务包括:script、script 、setTimeout、setInterval 、setImmediate 、I/O 、UI rendering。 先执行宏观任务队列,再执行微任务队列

Promise它的then(),catch(),finally()方法,会返回一个Promise ,所以可以允许我们链式调用,解决了传统的回调地狱问题。

async/await与Promise一样,是非阻塞的。async/await使得异步代码看起来像同步代码 await关键字只能用在aync定义的函数内。 async函数会隐式的返回一个promise,该promise的resolve值就是函数return的值。

优点:

1、Async/Await节约代码,我们不需要写.then,不需要写匿名函数处理Promise的resolve值, 不需要定义多余的data值,避免了嵌套代码。Async/Await让try/catch可以同时处理同步和异步错误。

2、async/await 的优势在于处理由多个 Promise 组成的 then 链。

3、async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。 await 命令后面的 Promise 对象,运行结果可能是 rejected,所以最好把 await 命令放在 try...catch 代码块中。

4、async 函数中可能会有 await 表达式,这会使 async 函数暂停执行,等待表达式中的 Promise 解析完成后继续执行 async 函数并返回解决结果。

5、async 函数返回一个 Promise 对象,当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。