async:
1. async 是异步的意思,await则可以理解为 async wait。所以可以理解async就是用来声明一个异步方法,而 await是用来等待异步方法执行
async作为一个关键字放在函数前面,表示该函数是一个异步函数,异步函数意味着该函数的执行不会阻塞后面代码的执行;而 await 用于等待一个异步方法执行完成;
async/await的作用就是使异步操作以同步的方式去执行
async的用法,在函数前面加上async关键字,表示函数是异步的。
async function timeout() {
return 'hello world!'
}
作用:async 函数返回的是一个promise 对象。即返回值将会被promise包裹,如果async函数中有返回值,当调用该函数时,内部会调用Promise.resolve()方法把它转化成一个promise对象作为返回
那么要想获取到async 函数的执行结果,就要调用promise的then 或 catch 来给它注册回调函数
async function timeout() {
return 'hello world!'
}
timeout().then(val => {
console.log(val)
})
console.log('我虽然在后面,但是先执行')
1、async函数的执行:会返回promise对象,并且把内部的值进行promise的封装。如果promise对象通过then或catch方法又注册了回调函数,async函数执行完以后,注册的回调函数就会放到异步队列中,等待执行。
如果只是async,和promise差不多,但有了await就不一样了,await关键字只能放到async函数里面,2、await在等待什么呢?
其实await不仅仅用于等Promise对象,还可以等任意表达式,所以await后面实际是可以接普通函数调用或者直接量的,**不过我们更多的是放一个返回promise 对象的表达式。他等待的是promise对象执行完毕,并返回结果。**
3、await的作用:阻塞后边的代码
不管await后面跟着的是什么,await都会阻塞后面的代码。阻塞的是该函数内部的代码,而非整段代码。
async function fn1 (){
console.log(1)
await fn2() // fn2进入微任务队列等待执行
console.log(2) // 阻塞
}
async function fn2 (){
console.log('fn2')
}
fn1()
console.log(3)
// 输出结果:1,fn2,3,2
总结:
async 函数1)函数的返回值为Promise对象2)Promise对象的结果由async函数执行的返回值决定
await 表达式1)正常情况下,await右侧的表达式一般为 promise对象 , 但也可以是其它的值2)如果表达式是promise对象,await就忙起来了,它会阻塞函数后面的代码,**等着Promise对象resolve,然后得到resolve的值,**作为await表达式的运算结果。3)如果表达式是其它值, 直接将此值作为await的返回值
**async**和**await**基于promise的。使用async的函数将会始终返回一个 promise 对象。这一点很重要,要记住,可能是你遇到容易犯错的地方。
在使用\**await\**的时候我们只是暂停了函数,而非整段代码。这里经常会是容易犯错的地方。
async和await是**非阻塞的**
仍然可以使用 **Promise**,例如**Promise.all(p1, p2, p3)**.,接受一个数组作为参数,p1、p2、p3 都是 Promise 实例,如果不是,就会先调用 Promise .resolve方法,将参数转为 Promise 实例,再进一步处理。只要 p1、p2、p3 之中有一个被 rejected,整个状态就变成 rejected。
注意1)await必须写在async函数中, 但async函数中可以没有await2)如果await的promise失败了, 就会抛出异常, 需要通过**try…catch**来捕获处理