有什么区别:
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服务获得不同的行为。有点太多的代码因此首先是上面的例子。
答案 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]
答案 1 :(得分:85)
你的两个例子应该表现得非常相似。
then()
处理程序中返回的值将成为从then()
返回的promise的解析值。如果.then
内返回的值是一个承诺,then()
返回的承诺将采用状态"承诺并解决/拒绝就像退回的承诺一样。
在第一个示例中,您在第一个"bbb"
处理程序中返回then()
,因此"bbb"
将传递到下一个then()
处理程序。
在第二个示例中,您返回一个立即使用值"bbb"
解析的承诺,因此"bbb"
将传递到下一个then()
处理程序。 (Promise.resolve()
这里是无关的。)
结果是一样的。
如果你能告诉我们一个实际表现出不同行为的例子,我们可以告诉你为什么会这样。
答案 2 :(得分:65)
简单来说,在then
处理函数内部:
A)当x
是值(数字,字符串等)时:
return x
相当于return Promise.resolve(x)
throw x
相当于return Promise.reject(x)
B)当x
是已经解决的承诺(不再等待)时
return x
相当于return Promise.resolve(x)
,如果承诺已经解决。return x
相当于return Promise.reject(x)
,如果承诺已被拒绝。 C)当x
是待处理的承诺时
return x
将返回待处理的Promise,并将在后续的then
中进行评估。 在Promise.prototype.then() docs上了解有关此主题的更多信息。
答案 3 :(得分:46)
你已经得到了一个很好的正式答案。我想我应该加一个简短的。
以下内容与Promises/A+承诺相同:
Promise.resolve
(在你的角色案例中$q.when
)new $q
。then
回调中返回值。 因此,以下对于承诺或普通值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 resolution。 promise chaining就是这样。