基本用法
执行函数时,遇到await
,会等到异步操作完成,再接着执行函数体内后面的语句。
如下代码会先打印1,再打印2。
function a() {
return new Promise((resolve) => {
setTimeout(function() {
console.log(1);
resolve();
}, 2000)
})
}
async function b() {
await a(); //a要返回一个Promise对象,否则await对它不起作用
console.log(2)
}
b()
返回Promise 对象
1.async
函数返回一个 Promise
对象。
2.async
函数内部return
语句返回的值 ,会成为then方法回调函数的参数。
async function asyncPrint() {
return "hello world";
}
asyncPrint().then(greeting => console.log(greeting)); //hello world
3.async
函数内部抛出错误,会导致返回的Promise
对象变为reject
状态。抛出的错误对象会被catch方法回调函数接收到。
async function asyncPrint() {
throw new Error('出错了');
}
asyncPrint()
.then(greeting => console.log(greeting))
.catch(err => console.log(err)); // Error: 出错了
-
async
函数返回的Promise
对象,必须等到内部所有await
命令后面的Promise
对象执行完,才会发生状态改变,除非遇到return
语句或者抛出错误。也就是说,只有async
函数内部的异步操作执行完,才会执行then
方法指定的回调函数。
await 命令
await后面应该返回一个Promise
对象,如果不是,就直接返回这个值。
async function f() {
// 等同于
// return 123;
return await 123;
}
f().then(v => console.log(v))
// 123
注意点
- 上面提到因为抛出错误会让状态变为
reject
, 所以最好把await
命令放在try...catch
代码块中, 如下
async function myFun() {
try {
await aa();
} catch (err) {
console.log(err);
}
}
// 另一种写法
async function myFun() {
await aa()
.catch(function (err) {
console.log(err);
});
}
-
getFoo
和getBar
是两个独立的异步操作,被写成继发关系。这样比较耗时,因为只有getFoo
完成以后,才会执行getBar
,完全可以让它们同时触发。
let foo = await getFoo();
let bar = await getBar();
多个await
命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。
// getFoo和getBar都是同时触发,这样就会缩短程序的执行时间
// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);
// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
网友评论