What's the difference between returning value or Promise.resolve from then()
有什么区别:
1 2 3 4 5 6 7 8 9 | new Promise(function(res, rej) { res("aaa"); }) .then(function(result) { return"bbb"; }) .then(function(result) { console.log(result); }); |
还有这个:
1 2 3 4 5 6 7 8 9 | new Promise(function(res, rej) { res("aaa"); }) .then(function(result) { return Promise.resolve("bbb"); }) .then(function(result) { console.log(result); }); |
号
我问的是,使用Angular和$HTTP服务进行链接时,我得到了不同的行为。代码有点太多,因此首先是上面的示例。
规则是,如果
引用承诺/A+规范:
The promise resolution procedure is an abstract operation taking as input a promise and a value, which we denote as
[[Resolve]](promise, x) . Ifx is a thenable, it attempts to make promise adopt the state ofx , under the assumption that x behaves at least somewhat like a promise. Otherwise, it fulfills promise with the valuex .This treatment of thenables allows promise implementations to interoperate, as long as they expose a Promises/A+-compliant then method. It also allows Promises/A+ implementations to"assimilate" nonconformant implementations with reasonable then methods.
号
这里要注意的关键是这一行:
if
x is a promise, adopt its state [3.4]link: https://promisesaplus.com/#point-49
号
你的两个例子应该表现得差不多。
在
在第一个示例中,您在第一个
在第二个示例中,您返回一个值为
结果是一样的。
如果你能给我们展示一个实际表现出不同行为的例子,我们就能告诉你为什么会这样。
简单来说,在
a)当
b)当
c)当
阅读promise.prototype.then()文档中有关此主题的更多信息。
你已经得到了一个很好的正式答案。我想我应该加一个短的。
以下内容与承诺/a+承诺相同:
- 打电话给
Promise.resolve (在角度的情况下,是$q.when ) - 调用Promise构造函数并在其冲突解决程序中解析。在你的例子中,那是
new $q 。 - 从
then 回调返回值。 - 在带有值的数组中调用promise.all,然后提取该值。
因此,对于承诺值或普通值x,以下内容完全相同:
1 2 3 4 | 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规范基于Promises解析过程,该过程使库(如$Q和本机Promises)之间的互操作变得容易,并使您的总体生活更加轻松。每当可能出现承诺解决方案时,都会出现解决方案,从而创建整体一致性。