async 函数
- 基本用法
async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。
- async 函数有多种使用形式。
// 函数声明
async function foo() {
}// 函数表达式
const foo = async function () {
};// 对象的方法
let obj = {
async foo() {
} };
obj.foo().then(...)// Class 的方法
class Storage {
constructor() {
this.cachePromise = caches.open('avatars');}async getAvatar(name) {
const cache = await this.cachePromise;return cache.match(`/avatars/${
name}.jpg`);}
}const storage = new Storage();
storage.getAvatar('jake').then(…);// 箭头函数
const foo = async () => {
};
- async函数内部return语句返回的值,会成为then方法回调函数的参数。
async function f() {
return 'hello world';
}f().then(v => console.log(v))
// "hello world"
- await 命令
正常情况下,await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。
async function f() {
// 等同于// return 123;return await 123;
}f().then(v => console.log(v))
// 123
- 任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行。
async function f() {
await Promise.reject('出错了');await Promise.resolve('hello world'); // 不会执行
}// 可执行方法一
async function f() {
try {
await Promise.reject('出错了');} catch(e) {
}return await Promise.resolve('hello world');
}f()
.then(v => console.log(v))
// hello world// 可执行方法二
async function f() {
await Promise.reject('出错了').catch(e => console.log(e));return await Promise.resolve('hello world');
}f()
.then(v => console.log(v))
// 出错了
// hello world
- 错误处理
- 如果await后面的异步操作出错,那么等同于async函数返回的 Promise 对象被reject。
async function f() {
await new Promise(function (resolve, reject) {
throw new Error('出错了');});
}f()
.then(v => console.log(v))
.catch(e => console.log(e))
// Error:出错了
- 使用注意点
- 多个await命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。
// 非同时触发
let foo = await getFoo();
let bar = await getBar();// 同时触发写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);// 同时触发写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
注:await只能存在于全局或async函数中,否则会报错。