模块 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 次尝试后可用的解决方案