async
和await
是JavaScript(包括TypeScript)中用于处理异步操作的关键字,它们提供了一种更直观、更易于理解的异步编程方式。以下是async
和await
的作用和用法的详细解释:
async的作用
- 声明异步函数:
async
关键字用于声明一个函数为异步函数。这意味着函数内部可能包含异步操作,如等待某个Promise的完成。 - 返回Promise对象:异步函数总是返回一个Promise对象。无论函数内部是否有显式的
return
语句,都会返回一个Promise对象。如果没有返回语句,函数会隐式地返回一个已解析(resolved)的Promise,其值为undefined
。
await的用法
- 等待Promise的完成:在
async
函数内部,await
关键字用于等待一个Promise对象的完成,并返回其解析后的值。await
后面可以跟任何表达式,但如果该表达式不是一个Promise,await
会将其视为一个已解析的Promise,并立即返回表达式的值。 - 阻塞当前函数的执行:当
await
后面跟的是一个Promise时,它会阻塞当前函数的执行,直到Promise完成(解析或拒绝)。但请注意,这并不意味着它会阻塞整个JavaScript线程;相反,JavaScript会继续执行其他任务,直到Promise完成并返回结果给await
。 - 错误处理:如果Promise被拒绝(reject),
await
表达式会抛出一个错误。这个错误可以通过在async
函数内部使用try...catch
结构来捕获。
以下是例子:
function delay(time) {
return new Promise(resolve => setTimeout(resolve, time));
}
async function demo() {
console.log('Taking a break...');
await delay(2000); // 等待2秒
console.log('Two second later');
}
demo();
在这个示例中,demo
函数是一个异步函数,它使用await
关键字来等待delay
函数返回的Promise的完成。delay
函数返回一个Promise,该Promise在指定的延迟时间后解析。当await delay(2000)
执行时,demo
函数的执行会暂停,直到delay
函数返回的Promise解析。然后,它会继续执行并打印出"Two second later"。