从 then() 返回值或 Promise.resolve 之间有什么区别

2022-08-29 23:37:52

有什么区别:

new Promise(function(res, rej) {
    res("aaa");
  })
  .then(function(result) {
    return "bbb";
  })
  .then(function(result) {
    console.log(result);
  });

和这个:

new Promise(function(res, rej) {
    res("aaa");
  })
  .then(function(result) {
    return Promise.resolve("bbb");
  })
  .then(function(result) {
    console.log(result);
  });

我问,因为我得到不同的行为使用Angular和$http服务与链接.then()。代码有点太多,因此首先是上面的示例。


答案 1

简单来说,在处理程序函数内部:then

A) 当 x 是一个值(数字、字符串等)时:

  1. return x等效于return Promise.resolve(x)
  2. throw x等效于return Promise.reject(x)

B) 当 x 是已结算的承诺(不再挂起)时:

  1. return x等效于 ,如果承诺已解决。return Promise.resolve(x)
  2. return x等价于 ,如果承诺已被拒绝。return Promise.reject(x)

C) 当 x 是待定的承诺时:

  1. return x将返回一个挂起的承诺,并将在后续的 上对其进行评估。then

Promise.prototype.then() docs 上阅读有关此主题的更多信息。


答案 2

规则是,如果处理程序中的函数返回一个值,则 promise 使用该值解析/拒绝,如果函数返回一个 promise,则发生的情况是,下一个子句将是函数返回的 promise 的子句,因此,在这种情况下,第一个示例通过的正常序列并打印出值,如人们所期望的那样, 在第二个示例中,当您执行 时返回的 promise 对象是链接时调用的对象(出于所有意图和目的)。它的实际工作方式在下面更详细地描述。thenthenthenthensPromise.resolve("bbb")then

引用承诺/A+规范:

承诺解析过程是一个抽象的操作,将承诺和值作为输入,我们将其表示为 。如果 x 是可数的,它试图让承诺采用 x 的状态,假设 x 的行为至少有点像承诺。否则,它将以 值 实现承诺 。[[Resolve]](promise, x)x

这种对 thenables 的处理允许 promise 实现进行互操作,只要它们公开了一个 Promises/A+ 兼容的 then 方法。它还允许Promises/A+实现用合理的方法“同化”不合格实现。

这里要注意的关键是这行:

如果是一个承诺,采用它的状态 [3.4]x

友情链接: https://promisesaplus.com/#point-49