返回值或Promise.Resolve from Then()之间有什么区别

lc8prwob  于 2022-09-18  发布在  Java
关注(0)|答案(6)|浏览(177)

以下各项有何不同:

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

还有这个:

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

当我使用带有链接的Angular 和$http服务得到不同的行为时,我问道。然后()。代码有点太多,因此先看上面的例子。

cig3rfwq

cig3rfwq1#

简单地说,在then处理程序函数中:

A)当x为值(数字、字符串等)时:

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

b)当x承诺已经结算(不再等待):

1.如果承诺已经解决,则return x等同于return Promise.resolve(x)
1.如果承诺已经被拒绝,return x等同于return Promise.reject(x)

C)当x为待定承诺时:

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

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

ycggw6v2

ycggw6v22#

规则是,如果then处理程序中的函数返回一个值,Promise使用该值进行解析/拒绝,如果函数返回Promise,则下一个then子句将是The Promise the Function Returnthen子句,因此,在本例中,第一个示例遵循thens的正常顺序并打印出值,在第二个示例中,当您执行Promise.resolve("bbb")时返回的Promise对象则是链接时调用的then。它的实际工作方式将在下面更详细地描述。

引用承诺/A+规范:
承诺解析过程是以承诺和值作为输入的抽象操作,我们将其表示为[[Resolve]](promise, x)。**如果x是一个使能,则它试图做出承诺采用x的状态,假设x的行为至少有点像承诺。否则,它将使用值x实现Promise。

这种对thenables的处理允许Promise实现进行互操作,只要它们公开了符合Promises/A+的Then方法。它还允许Promises/A+实现用合理的Then方法“同化”不符合规范的实现。

这里需要注意的关键一点是这一行:

如果x是承诺,则采用其状态[3.4]

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

bgibtngc

bgibtngc3#

您的两个示例的行为应该大体相同。

then()处理程序内部返回的值成为从该then()返回的承诺的解析值。如果.then内部返回的值是承诺,则then()返回的承诺将“采用”该承诺的状态,并像返回的承诺一样决定/拒绝。

在第一个示例中,您在第一个then()处理程序中返回"bbb",因此"bbb"被传递到下一个then()处理程序。

在第二个示例中,您返回一个承诺,该承诺立即用值"bbb"解析,因此"bbb"被传递到下一个then()处理程序。(这里的Promise.resolve()是无关的)。

结果是一样的。

如果你能给我们展示一个实际表现出不同行为的例子,我们就能告诉你为什么会发生这种情况。

flvlnr44

flvlnr444#

你已经得到了一个很好的正式答复。我想我应该加上一个简短的。

以下内容与Promises/A+承诺相同:

  • 调用Promise.resolve(在您的Angular 中为$q.when)
  • 调用Promise构造函数并在其解析器中进行解析。在你的例子中,这是new $q
  • then回调返回一个值。
  • 对具有值的数组调用Promise.All,然后提取该值。

因此,对于承诺值或普通值X,以下所有条件都是相同的:

Promise.resolve(x);
new Promise(function(resolve, reject){ resolve(x); });
Promise.resolve().then(function(){ return x; });
Promise.all([x]).then(function(arr){ return arr[0]; });

不足为奇的是,Promise规范基于Promise Resolve过程,该过程支持库之间的轻松互操作(如$Q和本机Promise),并使您的工作总体上更轻松。每当可能出现承诺解决方案时,解决方案就会出现,从而创造整体的一致性。

jgwigjjp

jgwigjjp5#

唯一的区别是,当你做return Promise.resolve("bbb")时,你正在创造一个不必要的承诺。从onFulfilled()处理程序返回承诺开始promise resolution。这就是承诺链的工作原理。

i86rm4rw

i86rm4rw6#

只是一点而已。正如您在调试器中看到的那样,‘Resolve’函数不会返回。如果这是最后一句话,它似乎会回来。“Resolve”将承诺设置为已满,但如果下面有更多语句,则继续执行。

你可以在这里读到:'Why does javascript ES6 Promises continue execution after a resolve?'

这让我非常困惑,因为在大多数例子中都没有解释。因此,从现在开始,我必须记住使用‘Return Resolve(Value)’或‘If Resolve(Value)Else...Other Code’,或者只使用‘Resolve’作为最后一条语句。

相关问题