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

2020/10/03 04:21 · javascript ·  · 0评论

之间有什么区别?

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()时出现不同的行为。因此,代码太多了,因此首先是上面的示例。

规则是,如果then处理程序中的函数返回一个值,则promise将使用该值进行解析/拒绝;如果函数返回一个promise,则发生的情况是,下一个then子句将成为该函数返回的promise的then子句,因此,在这种情况下,第一个示例遵循正常的顺序并按预期输出值,在第二个示例中,当您执行操作时返回的promise对象链接时被调用的对象(出于所有意图和目的)。其实际工作方式将在下面详细介绍。thensPromise.resolve("bbb")then

引用Promises / A +规范:

承诺解决程序是一个抽象操作,将承诺和值(我们称为)作为输入[[Resolve]](promise, x)如果x是可能的,则在x的行为至少类似于promise的假设下,尝试使promise采用状态x否则,它将用值实现承诺x

这种对可实现对象的处理使答应实现可以互操作,只要它们公开了符合Promises / A +的then方法即可。它还允许Promises / A +实现使用合理的then方法“整合”不合格的实现。

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

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

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

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

A)当x是值(数字,字符串等)时:

  1. return x 相当于 return Promise.resolve(x)
  2. throw x 相当于 return Promise.reject(x)

B)什么时候x已结算的诺言(不再等待中):

  1. return xreturn Promise.resolve(x)如果Promise已解决,则等于
  2. return xreturn Promise.reject(x)如果Promise已被拒绝,则等于

C)什么时候x是一个尚待履行的承诺:

  1. return x将返回待处理的Promise,并将在随后的进行评估then

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

您的两个示例的行为应该几乎相同。

then()处理程序内部返回的值将成为从处理程序返回的promise的分辨率值then()如果在内部返回的值.then 是一个承诺,则所返回的承诺then()将“采用该承诺的状态”,并像返回的承诺一样进行解析/拒绝。

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

在第二个示例中,您返回一个Promise,该Promise将立即用value解析"bbb",因此"bbb"将传递给下一个then()处理程序。Promise.resolve()这里是多余的)。

结果是一样的。

如果您可以向我们展示一个实际表现出不同行为的示例,那么我们可以告诉您为什么会发生这种情况。

您已经有了一个很好的正式答案。我想我应该加一个简短的。

以下内容与Promises / A + promises相同

  • 呼叫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 Resolution Procedure,它使库之间的互操作变得容易(例如$ q和本机promise),并使您的整体生活更轻松。每当可能发生承诺解决方案时,都会发生解决方案,从而创建总体一致性。

唯一的区别是,您这样做时会创建不必要的承诺return Promise.resolve("bbb")onFulfilled()处理程序中返回承诺,将启动承诺解决方案这就是承诺链的工作方式。

本文地址:http://javascript.askforanswer.com/congthenfanhuizhihuopromise-resolveyoushenmequbie.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!