为什么Promise构造函数要求一个调用 'resolve' 的函数来表示完成,而 'then' 方法却不需要 - 它返回一个值呢?

21 浏览
0 Comments

为什么Promise构造函数要求一个调用 'resolve' 的函数来表示完成,而 'then' 方法却不需要 - 它返回一个值呢?

当我深入研究 Promise 时,我对以下问题产生了疑问,而我没有找到相关讨论(我只找到了关于 Promise 构造函数和 Promise 'then' 函数的具体讨论,但没有比较它们设计模式的讨论)。

1. Promise 构造函数

根据 MDN 文档,我们可以使用 Promise 构造函数(附带我的评论):

new Promise(function(resolve, reject) { ... }); // <-- 将其称为阶段 1

函数对象带有两个参数 resolve 和 reject。第一个参数用于实现 promise,第二个参数用于拒绝 promise。我们可以在操作完成后调用这些函数。

2. then 函数

继续讨论可以在 Promise 对象上调用的 then 函数(它返回一个新的 Promise 对象),根据文档所述,函数签名如下(附带我的评论):

p.then(onFulfilled, onRejected);

链式调用

因为 then 方法返回一个 Promise,所以可以轻松地链式调用 then。

var p2 = new Promise(function(resolve, reject) {

resolve(1); // <-- 再次称为阶段 1

});

p2.then(function(value) {

console.log(value); // 1

return value + 1; // <-- 将其称为阶段 2

}).then(function(value) {

console.log(value); // 2

});

我的问题

从上面的代码片段可以清楚地看出,在阶段 1 中传递给 resolve 函数的值(在第二次出现的 resolve 下面)会传递给下一个阶段(代码片段中紧随其后的第一个 then 函数)。阶段 1 没有返回值。然而,阶段 2 的返回值会传递给其后的下一个阶段(第二个 then 函数)。

这种在创建 Promise 的设计模式和在现有 Promise 上使用 then 函数的设计模式之间缺乏对应关系,只是一个历史上的偶然事件吗(一个需要调用回调但不返回任何内容,另一个返回值但不调用回调)?

还是我忽略了 Promise 构造函数采用不同设计模式的潜在原因?

0