async 标识的函数返回一个promise对象,所以该函数内部,可以添加任何的异步操作代码。而 await 就是then的语法糖。
async function f1() { }
const res = f1();
console.log(res); // Promise { undefined } (返回一个promise对象)
async function f1() {
return 'aaa'
}
const res = f1();
console.log(res); // Promise { 'aaa' }
f1().then(v => { // 使用then来处理Promise对象
console.log(v); // aaa
});
没有 await 的情况下执行 async 函数,它会立即执行,返回一个 Promise 对象。
有await的情况下,await 可以用于等待 async 函数的返回值(得到Promise对象的resolve值,作为await表达式的运算结果)。
async/await 的优势:可以很好地处理 then 链
对于单一的 Promise 链其实并不能发现 async/await 的优势,当需要处理多个 Promise 组成的 then 链的时候,优势就能体现出来了。
特点:阻塞式(async await会阻止代码往下执行)。await操作符后面可以是任意值,当是Promise对象的时候,会暂停async标识的函数的执行。也就是说,必须得等待await后面的Promise处理完成才能继续往下执行。
基本用法:
const fn = async ()=>{
const fn1 = await newPromise()
return fn1 + 1
}
await后面跟Promise对象:
function f1() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1)
}, 1000)
})
}
async function f2() {
let res = await f1() // 得到Promise对象的resolve值,作为await表达式的运算结果
console.log(res);
console.log('aaa')
}
f2() // 1s后输出 1 和 aaa
await后面跟其他(比如一个普通函数),那么此时await就不会阻止代码往下执行:
function f2() {
setTimeout(() => {
console.log(2)
}, 1000)
}
async function f3() {
let res = await f2()
console.log('aaa')
}
f3() // 先输出aaa 1s后输出2
例:传入参数 n,表示这个函数执行的时间;执行的结果是 n + 200,这个值将用于下一步骤
function takeLongTime(n) {
return new Promise(resolve => {
setTimeout(() => resolve(n + 200), n);
});
}
function step1(n) {
console.log(`step1 with ${n}`);
return takeLongTime(n);
}
function step2(n) {
console.log(`step2 with ${n}`);
return takeLongTime(n);
}
function step3(n) {
console.log(`step3 with ${n}`);
return takeLongTime(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}`);
console.timeEnd("doIt");
});
}
doIt();
async/await方法:
async function 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();