返回值或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
子句将成为promise的then
子句函数返回 ,所以在这种情况下,第一个例子按照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等)时:
-
return x
相当于return Promise.resolve(x)
-
throw x
相当于return Promise.reject(x)
B)当x
是一个已经解决的承诺(不再是待定):
- 如果Promise已经解决,
return x
相当于return Promise.resolve(x)
。 -
return x
相当于return Promise.reject(x)
,如果Promise已经被拒绝了。
C)当x
是待定的承诺时:
-
return x
将返回一个未决的Promise,并将在随后的评估。
阅读关于Promise.prototype.then()文档的更多信息 。