跳转到主要内容
模块 7 · 第 2 课(共 4)课程中的26/32~12 min
模块课程(2/4)

异步/等待

async/await 是使用 Promises 的更清晰的语法:代码 ** 读起来像 同步代码**,但在幕后它使用与上一课完全相同的 Promises。

async function

使用 async 声明的函数始终返回 Promise。

JS
async function forty() {
  return 40;
}

forty(); // Promise { 40 }
forty().then((v) => console.log(v)); // 40

即使您返回一个“正常”值,该函数也会将其包装在已解析的 Promise 中。

await

在 async function 中,您可以将 await 放在 Promise 之前:执行被 暂停 直到 Promise 解决,然后继续处理已解决的值。

JS
async function sum() {
  const a = await Promise.resolve(10);
  const b = await Promise.resolve(20);
  return a + b; // 30
}

相当于 .then 风格(更详细):

JS
function sum() {
  return Promise.resolve(10).then((a) => Promise.resolve(20).then((b) => a + b));
}

await 传播错误

如果 Promise 被 rejected, await 会重新抛出错误。你可以用普通的方法来捕获它 try/catch:

JS
async function read() {
  try {
    const x = await Promise.reject(new Error('no'));
    return x;
  } catch (err) {
    return 'error: ' + err.message;
  }
}

read(); // Promise { 'error: no' }

箭头异步

JS
const double = async (n) => n * 2;
double(5); // Promise { 10 }

尝试一下

锻炼#js.m7.l2.e1
尝试:0加载中...

定义一个“异步函数 addOne(p)”,它接收数字的 Promise 并返回(作为 Promise)数字 + 1。使用 wait。

正在加载编辑器...
显示提示

const n = 等待 p;返回n+1;

3 次尝试后可用的解决方案

复习练习

锻炼#js.m7.l2.e2
尝试:0加载中...

定义异步 `sumTwo(pa, pb)`:接收两个数字 Promise,返回它们的和。使用两个连续的等待。

正在加载编辑器...
显示提示

等待每一个,然后返回 a + b。

3 次尝试后可用的解决方案