什么是Async/Await?
async/await是写异步代码的新方式,以前的方法有回调函数和Promise。
async/await是基于Promise实现的,它不能用于普通的回调函数。
async/await使得异步代码看起来像同步代码。
//使用promise
const makeRequest = () =>
getJSON().then(data => {
console.log(data)
return "done"
})
//使用async,await
const makeRequest = async () => {
// await getJSON()表示console.log会等到getJSON的promise成功reosolve之后再执行。
console.log(await getJSON)
return "done"
}
区别:
函数前面多了一个aync关键字。await关键字只能用在aync定义的函数内。async函数会隐式地返回一个promise,该promise的reosolve值就是函数return的值。
Async/Await相比于promise的优势:
1)使用async函数可以让代码简洁很多,不需要像Promise一样需要些then,不需要写匿名函数处理Promise的resolve值,也不需要定义多余的data变量,还避免了嵌套代码。
2) 错误处理:Async/Await 让 try/catch 可以同时处理同步和异步错误。如果它在Promise中。我们需要使用 .catch。
const makeRequest = async () => {
try {
// this parse may fail
const data = JSON.parse(await getJSON())
console.log(data)
} catch (err) {
console.log(err)
}
}
你很可能遇到过这样的场景,调用promise1,使用promise1返回的结果去调用promise2,然后使用promise2结果去调用promise3。
//promise.then方式
const makeRequest = () => {
return promise1().then(value1 => {
return promise2(value1).then(value2 => {
return promise3( value2)
})
})
}
//async,await方式
const makeRequest = async () => {
const value1 = await promise1()
const value2 = await promise2(value1)
return promise3(value2)
}
promise.then.then链式写法太麻烦,代码可读性也差,如果用async,await方式就不一样,代码看起来像同步的一样,可能你还会想到用promise.all([])方法,这样确实简单,但如果题目改成使用promise1,promise2结果去调用promise3,promise.all([])方法就为了可读性牺牲了语义,所以最好还是使用async,await方式。