在面试的过程中如果不了解promise、async事件循环机制基本就会认为你是CV工程师
首先分析 async/await 其实是基于promise实现的,async 函数其实就是把 promise 做了一个包装
promise 是es6的语法,async/await 是es7的语法糖,所以我们先来分析一下 事件循环机制
事件循环机制
1.事件循环机制是为解决单线程代码执行不阻塞主进程一种机制,也就是我们所说的异步原理
2.因为JavaScript是单线程,事件循环机制是为了解决单线程阻塞、从上往下执行。执行完毕 => 判断是否微任务 => 判断是否有宏任务
3.整体的script(作为第一个宏任务)开始执行的时候,会把所有代码分为两部分:“同步任务”、“异步任务”;
- 宏任务
setInterval()
setTimeout() - 微任务
new Promise()后的.then与.catch函数
async/await
1.promise里的then才会被加入微任务,他的resolve,是同步里的。
2.而async函数里遇到await之前的代码是同步里的,遇到await时,会执行await后面的函数,然后返回一个promise,把await下面的代码放入微任务,并且退出这个async函数。
-通俗易懂:
同步:一件事做完了才到另一件事(如果上一件事情没做完,就会一直卡在这里所以造成了阻塞)
异步:在做一件事请,这件事还没做完就开始做另一件事(互不影响,可以一起做事情)
promise
-
Promise,简单说就是一个容器,在里面进行处理出结果(成功或失败)。
-
Promise 一共有三种状态
1.pending 初始状态
2.fulfilled 成功状态
3.rejected 失败状态
new Promise((resolve,reject) => {.then((data) => { //接收传输成功的数据console.log(data); }).catch((err) => { //接收请求失败的数据console.log(err); }).finally((all) => { // 无论成功失败都会执行console.log(all);})
-
Promise.resolve
将传递给它的参数填充 Fulfilled 到 Promise 对象后并返回这个 Promise 对象。 -
Promise.reject
它的功能是调用该 Promise对象通过then指定的 onRejected函数,并讲错误(Error)对象传递给这个onRejected函数 -
Promise.then
异步调用方式 -
Promise.all
1.如果所有的Promise中有一个错误,走的是Promise.all().catch()这个。但是不影响其他 Promise 还是会正常执行,但不会返回结果
2.特性:接受一个promise 对象的数组作为参数,同时开始、并行执行的,可以执行多个 -
Promise.allSettled
1.Promise.allSettled()在你需要执行平行和独立的异步操作并收集所有结果时非常有效, 即使某些异步操作可能失败。
2.特性:接受一个promise 对象的数组作为参数、同时开始、并行执行的,可以执行多个、但不会走catch -
Promise.rece
1.特性:接受一个promise 对象的数组作为参数、同时开始、并行执行的,可以执行多个、
这里我们重点理一下 Promise.rece 和 Promise.all() 的区别
- Promise.all获得的成功结果的数组里面的数据顺序和Promise.all接收到的数组顺序是一致的
- Promse.race是里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。
亿点小知识:Promise本身是同步执行,.then是异步执行的
async / await
- async/await 其实是基于promise实现的,async 函数其实就是把 promise 做了一个包装
为什么那么说呢 我们看一下代码
async function Methods(){return "内容值"
}
/*
async 自动包装成Promise对象,等于
function Methods(){return new Promise((resolve) => {resolve("内容值")})
}
*/
总结:
共同点:两者都是处理异步请求的方式
不同点:
- promise是返回的对象要用then().catch()去处理数据和捕获异常,而且书写方式是链式的,容易造成代码多层堆叠难以维护;
- async await 则是通过try{}.cathc{}进行捕获直接抛出异常
以上就是《web面试—倚天屠龙》感谢大家的阅读
如碰到其他的问题 可以私下我 一起探讨学习
如果对你有所帮助还请点赞
收藏谢谢~!
关注收藏博客 作者会持续更新…