学习呦
14 10月 2025 4 min read

async、await

Written by 米豆

async、await

async

概念:

在函数前的一个关键字,一个标识。有此关键字的函数返回的值会自动的用一个resolved的Promise包装Promise.resolve('xxx')

await

概念:

提供一种中断和恢复程序执行的能力,中断的地方在await关键字的下面(不是关键字后面!!),如果后面是一个Promise,则等待Promise的状态变为resolve(也就是执行了这个Promise的resolve)之后接收执行的结果
如果await后面跟随的不是一个Promise,是一个值,或者普通函数,那么就会按照普通函数执行,或者返回值

let bar = await 'foo'
// bar 的值是 foo

let foo = await () => 'bar'
// foo 的值是 bar

注意:

async和await必须成对的出现,且async包含await。在Module模块化的js文件中,await可以顶层写

async function f() {
let promise = new Promise((resolve, reject) => {
setTimeout(() => resolve("done!"), 1000)
});
let result = await promise; // 等待,直到 promise resolve (*)
alert(result); // "done!"
}

比如下面例子

// 我们假设此代码在 module 中的顶层运行
let response = await fetch('/article/promise-chaining/user.json');
let user = await response.json();

其他模块通过import导入这个模块

错误处理

  • try...catch

  • async函数后直接.catch()调用捕获错误

  • 全局错误处理函数

不处理会打印在控制台,且终止函数的运行,毕竟抛出了错误没有管

PS. 如果在Promise中发生了异常,会执行Promise.reject(err),表现在async/await中就是await接收一个前面的rejected,如果没处理错误就会停止程序的执行

async function f() {
let response = await fetch('http://no-such-url');
}
// f() 变成了一个 rejected 的 promise
f().catch(alert); // TypeError: failed to fetch // (*)
↑