返回值或Promise.resolve与then()之间的区别是什么

有什么区别:

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()。 因此,上面的例子有点太多了。

规则是,如果处理程序中的函数返回一个值,那么promise会使用该值来parsing/拒绝,如果函数返回一个promise,那么接下来的then子句将成为promisethen子句函数返回 ,所以在这种情况下,第一个例子按照thens的正常顺序thens ,打印出你thens值,在第二个例子中,当你做Promise.resolve("bbb")则是链接时调用的那个(为了所有的意图和目的)。 它的实际工作方式在下面更详细地描述。

从Promises / A +规范引用:

承诺解决程序是一个抽象的操作,将input的承诺和价值作为input,我们表示为[[Resolve]](promise, x)如果x是一个可接受的,它假设承诺采用x的状态,假设x的行为至less有点像一个承诺 。 否则,它用x来履行诺言。

这种对可执行文件的处理允许promise实现互操作,只要它们公开Promise / A +遵循的方法即可。 它还允许Promises / A +实现用合理的方法“吸收”不一致的实现。

关键是要注意这一行:

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

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

你的两个例子都应该有相同的performance。

then()处理程序中返回的值将成为从then()返回的promise的分辨率值。 如果在.then内部返回的值是一个承诺,那么由then()返回的承诺将“接受该承诺的状态”,并像返回的承诺那样解决/拒绝。

在你的第一个例子中,你在第一个then()处理程序中返回"bbb" ,所以"bbb"被传递到next then()处理程序中。

在你的第二个例子中,你返回一个立即用值"bbb"parsing的promise,所以"bbb"被传递到next then()处理程序中。 (这里的Promise.resolve()是无关的)。

结果是一样的。

如果你能向我们展示一个实际上performance出不同行为的例子,我们可以告诉你为什么会发生这种情况。

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

以下事项与Promises / A +承诺相同:

  • 调用Promise.resolve (在您的$q.when Angular案例中)
  • 调用promise构造函数并parsing其parsing器。 在你的情况下,这是new $q
  • 从callback中返回一个值。
  • 使用值调用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和原生承诺),并使您的整体生活更加简单。 只要承诺解决scheme可能发生,解决scheme就会产生整体一致性。

简而言之,在一个处理函数中:

A)当x是一个值(数字,string等)时:

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

B)当x是一个已经解决的承诺(不再是待定):

  1. 如果Promise已经解决, return x相当于return Promise.resolve(x)
  2. return x相当于return Promise.reject(x) ,如果Promise已经被拒绝了。

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

  1. return x将返回一个未决的Promise,并将在随后的评估。

阅读关于Promise.prototype.then()文档的更多信息 。