async/await用法
其实你要实现一个东西之前,最好是先搞清楚这两样东西
- 这个东西有什么用?
- 这个东西是怎么用的?
有什么用?
async/await
的用处就是:用同步方式,执行异步操作,怎么说呢?举个例子
比如我现在有一个需求:先请求完接口1
,再去请求接口2
,我们通常会这么做
function request(num) { // 模拟接口请求
return new Promise(resolve => {
setTimeout(() => {
resolve(num * 2)
}, 1000)
})
}
request(1).then(res1 => {
console.log(res1) // 1秒后 输出 2
request(2).then(res2 => {
console.log(res2) // 2秒后 输出 4
})
})
复制代码
或者我现在又有一个需求:先请求完接口1
,再拿接口1
返回的数据,去当做接口2
的请求参数,那我们也可以这么做
request(5).then(res1 => {
console.log(res1) // 1秒后 输出 10
request(res1).then(res2 => {
console.log(res2) // 2秒后 输出 20
})
})
复制代码
其实这么做是没问题的,但是如果嵌套的多了,不免有点不雅观,这个时候就可以用async/await
来解决了
async function fn () {
const res1 = await request(5)
const res2 = await request(res1)
console.log(res2) // 2秒后输出 20
}
fn()
复制代码
是怎么用?
还是用刚刚的例子
需求一:
async function fn () {
await request(1)
await request(2)
// 2秒后执行完
}
fn()
复制代码
需求二:
async function fn () {
const res1 = await request(5)
const res2 = await request(res1)
console.log(res2) // 2秒后输出 20
}
fn()
复制代码
![](https://img.haomeiwen.com/i26538229/fd159b3ab8e8a5e4.png)
其实就类似于生活中的排队
,咱们生活中排队买东西,肯定是要上一个人买完,才轮到下一个人。而上面也一样,在async
函数中,await
规定了异步操作只能一个一个排队执行,从而达到用同步方式,执行异步操作的效果,这里注意了:await只能在async函数中使用,不然会报错哦
刚刚上面的例子await
后面都是跟着异步操作Promise
,那如果不接Promise
会怎么样呢?
function request(num) { // 去掉Promise
setTimeout(() => {
console.log(num * 2)
}, 1000)
}
async function fn() {
await request(1) // 2
await request(2) // 4
// 1秒后执行完 同时输出
}
fn()
复制代码
可以看出,如果await
后面接的不是Promise
的话,其实是达不到排队
的效果的
说完await
,咱们聊聊async
吧,async
是一个位于function之前的前缀,只有async函数
中,才能使用await
。那async
执行完是返回一个什么东西呢?
async function fn () {}
console.log(fn) // [AsyncFunction: fn]
console.log(fn()) // Promise {<fulfilled>: undefined}
复制代码
可以看出,async函数
执行完会自动返回一个状态为fulfilled
的Promise,也就是成功状态,但是值却是undefined,那要怎么才能使值不是undefined呢?很简单,函数有return
返回值就行了
async function fn (num) {
return num
}
console.log(fn) // [AsyncFunction: fn]
console.log(fn(10)) // Promise {<fulfilled>: 10}
fn(10).then(res => console.log(res)) // 10
复制代码
可以看出,此时就有值了,并且还能使用then方法
进行输出
总结
总结一下async/await
的知识点
- await只能在async函数中使用,不然会报错
- async函数返回的是一个状态为fuifilled的Promise对象,有无值看有无return值
- await后面只有接了Promise才能实现排队效果
- async/await作用是用同步方式,执行异步操作
作者:Sunshine_Lin
链接:https://juejin.cn/post/7007031572238958629
网友评论