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

承诺:它们是什么

Promise 是一个值,表示将在将来完成的操作的结果。 它可以处于以下三种状态之一:

  • 待处理 — 操作仍在进行中
  • fulfilled — 成功完成,有价值
  • 拒绝 — 失败,有错误

一旦离开挂起状态,它就永远“稳定”了。

创建已解决的 Promise

两种最常见的方法——你几乎永远不会用构造函数“手动”创建 Promise:

JS
const p1 = Promise.resolve(42);
const p2 = Promise.reject(new Error('oops'));

读取结果:.then / .catch

JS
Promise.resolve(10).then((v) => {
  console.log(v); // 10
});

Promise.reject(new Error('no')).catch((e) => {
  console.log(e.message); // 'no'
});

.then 接收一个使用 解析值 调用的函数。 .catch 接收一个在拒绝的情况下调用的带有错误的函数。

链接

每个 .then 依次返回一个 Promise:你可以链接它们来转换 价值一步一步。

JS
Promise.resolve(5)
  .then((n) => n * 2)
  .then((n) => n + 1)
  .then((n) => console.log(n)); // 11

如果任何 .then 抛出(或返回失败的 Promise),则执行 跳转到第一个后续 .catch。

构造函数(罕见)

JS
const p = new Promise((resolve, reject) => {
  if (Math.random() > 0.5) resolve('ok');
  else reject(new Error('no'));
});

仅当您需要“承诺”使用回调的某些内容(例如旧的 DOM API 或 setTimeout)时,您才会使用它。

尝试一下

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

定义“promisedVersion(n)”,给定一个数字,返回一个用 n 的双倍解析的 Promise。

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

返回 Promise.resolve(n * 2)

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

复习练习

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

定义接收数字 Promise 并返回数字 + 3 的 Promise 的“incrementThree(p)”。使用 .then 链。

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

p.then((n) => n + 3)

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