任务管理
JavaScript是单线程。JavaScript在处理异步操作时,利用的是事件循环机制。
主线程中的任务执行完后,才执行队列中的任务。有新任务到来时会将其放入队列,采取先进先执行的策略执行队列中的任务。比如setTimeout同时到了时间,就要依次执行。下面通过一个例子来详细分析宏任务与微任务

1.先执行宏任务,然后输出 后盾人
2.执行到setTimeout异步宏任务,将其放入到宏任务队列,等待执行
3.执行promise.then微任务,将其放入微任务队列,等待执行
4.然后执行到主代码输出 houdunren.com
5.主线程所有的任务处理完成
6.通过事件循环遍历微任务队列,将刚才放入的Promise.then微任务读取到主线程执行,然后输出 promise1
7.之后又执行promise.then产生的微任务,并放入微任务队列中
8.主线程任务执行完毕
9.再次事件循环遍历微任务队列,读取到promise2微任务放入主线程执行,然后输出 promise2
10.主线程任务执行完毕
11.此时微任务队列已经无任务,然后宏任务队列中读取setTimeout任务并加入主线程,然后输出
定时器
# Node环境下的宏任务
1.I/O 操作
2.setTimeout
3.setInterval
4.setImmediate
# Node环境下微任务
1.Promise
2.process.nextTick
promise
JavaScript 中存在很多异步操作,Promise 将异步操作队列化,按照期望的顺序执行,返回符合预期的结果。可以通过链式调用多个 Promise 达到我们的目的。

1.使用.then可以解决回调地域的问题,每次的then都是一个全新的promise。每个 then 会是一个新的promise,默认传递 fulfilled状态。
2.一个完整的promise,如果为错误,则必须对错误进行处理。
3.promise会立即执行,因此可以将其封装在函数里调用。
4.promise内有错误一个类似try...catch的处理机制,catch 可以捕获之前所有 promise 的错误,所以建议将 catch 放在最后。在 promise 中抛出的错误也会被catch 捕获
5..finally中的代码不论promise状态都会被执行
6.使用Promise.all 方法可以同时执行多个并行异步操作

7.allSettled 用于处理多个promise ,只关注执行完成,不关注是否全部执行成功,allSettled 状态只会是fulfilled。

8.race()
使用Promise.race() 处理容错异步,和race单词一样哪个Promise快用哪个,哪个先返回用哪个。以最快返回的promise为准。如果最快返加的状态为rejected 那整个promise为rejected执行cache。如果参数不是promise,内部将自动转为promise。
9.使用 async/await 是promise 的语法糖,可以让编写 promise 更清晰易懂,也是推荐编写promise 的方式。
10.await 后面一般是promise,如果不是直接返回。await 必须放在 async 定义的函数中使用。await 用于替代 then 使编码更优雅。

网友评论