async/await是一种建立在Promise之上的编写异步或阻塞代码的新方法,被普遍认为是js一步操作的最终且最优雅的解决方案。相对于Promise和回调,它的可读性和简洁度都更高。一直.then()也不好看。
所以从语义上就很好理解 async用于声明一个function是异步的,而await用于等待一个异步方法执行完成。一个函数如果加上async,那么该函数返回的是一个Promise
async function test() {
return "1"
}
console.log(test()) // -> Promise {<resolved>: "1"}
async函数返回的是一个Promise对象,如果在async函数中直接return一个量,async会把这个量通过Promise.resolve()封装成Promise对象返回。
function A(n) {
return new Promise(resolve => {
setTimeout(() => resolve(n + 200), n);
});
}
function step1(n) {
console.log(`step1 with ${n}`);
return A(n);
}
function step2(n) {
console.log(`step2 with ${n}`);
return A(n);
}
function step3(n) {
console.log(`step3 with ${n}`);
return A(n);
}
使用Promise
function doIt() {
console.time("doIt");
const time1 = 300;
step1(time1)
.then(time2 => step2(time2))
.then(time3 => step3(time3))
.then(result => {
console.log(`result is ${result}`);
});
}
doIt();
// step1 with 300
// step2 with 500
// step3 with 700
// result is 900
使用async/await
async function doIt() {
console.time("doIt");
const time1 = 300;
const time2 = await step1(time1);
const time3 = await step2(time2);
const result = await step3(time3);
console.log(`result is ${result}`);
}
doIt();
相比于Promise,async/await能更好的处理then链
await关键字只能在async function中使用,在任何非async function的函数中使用await关键字都会抛出错误。await关键字在执行下一行代码之前 等待右侧表达式(可能是一个Promise)返回。
优缺点:
async/await的优势在于处理then的调用链,能够更清晰准确的写出代码,并且也能解决回调地狱的问题。当然也存在一些缺点,因为await将异步代码改造成了同步代码,如果多个异步代码没有依赖性却使用了await会导致性能上的降低。