从那时起返回值或Promise.resolve的区别是什么()

时间:2014-12-31 02:08:30

标签: javascript angularjs promise q

有什么区别:

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);
  });

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

5 个答案:

答案 0 :(得分:120)

规则是,如果then处理程序中的函数返回一个值,则promise使用该值解析/拒绝,如果函数返回一个promise,则会发生什么,下一个{{1子句将是函数返回的承诺的then子句,因此,在这种情况下,第一个示例落在then的正常序列中并打印出来可以预期的值,在第二个示例中,当您执行thens时返回的promise对象是链接时调用的Promise.resolve("bbb")(用于所有意图和目的) 。它的实际工作方式将在下面详细介绍。

引用Promise / A +规范:

  

承诺解决程序是一个抽象操作,将promise和值作为输入,我们将其表示为then如果[[Resolve]](promise, x)是一个可用的,它会尝试承诺采用x 的状态,假设x的行为至少有点像承诺。否则,它会使用值x履行承诺。

     

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

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

  

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

     

link:https://promisesaplus.com/#point-49

答案 1 :(得分:85)

你的两个例子应该表现得非常相似。

then()处理程序中返回的值将成为从then()返回的promise的解析值。如果.then内返回的值是一个承诺,then()返回的承诺将采用状态"承诺并解决/拒绝就像退回的承诺一样。

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

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

结果是一样的。

如果你能告诉我们一个实际表现出不同行为的例子,我们可以告诉你为什么会这样。

答案 2 :(得分:65)

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

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

  1. return x相当于return Promise.resolve(x)
  2. throw x相当于return Promise.reject(x)
  3. B)当x是已经解决的承诺(不再等待)时

    1. return x相当于return Promise.resolve(x),如果承诺已经解决。
    2. return x相当于return Promise.reject(x),如果承诺已被拒绝。
    3. C)当x是待处理的承诺时

      1. return x将返回待处理的Promise,并将在后续的then中进行评估。
      2. Promise.prototype.then() docs上了解有关此主题的更多信息。

答案 3 :(得分:46)

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

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

  • 致电Promise.resolve(在你的角色案例中$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]; });

并且毫不奇怪,promises规范基于Promise Resolution Procedure,它可以实现库之间的轻松互操作(如$ q和本机承诺),让您的生活更轻松。只要可能发生承诺解决,就会出现解决方案,从而产生整体一致

答案 4 :(得分:1)

唯一的区别是,您执行return Promise.resolve("bbb")时会创建不必要的承诺。从onFulfilled()处理程序返回的承诺开始promise resolutionpromise chaining就是这样。