以下各项有何不同:
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return "bbb"; // directly returning string
})
.then(function(result) {
console.log(result);
});
还有这个:
new Promise(function(res, rej) {
res("aaa");
})
.then(function(result) {
return Promise.resolve("bbb"); // returning a promise
})
.then(function(result) {
console.log(result);
});
当我使用带有链接的Angular 和$http服务得到不同的行为时,我问道。然后()。代码有点太多,因此先看上面的例子。
6条答案
按热度按时间cig3rfwq1#
简单地说,在
then
处理程序函数中:A)当
x
为值(数字、字符串等)时:1.
return x
等同于return Promise.resolve(x)
1.
throw x
等同于return Promise.reject(x)
b)当
x
承诺已经结算(不再等待):1.如果承诺已经解决,则
return x
等同于return Promise.resolve(x)
。1.如果承诺已经被拒绝,
return x
等同于return Promise.reject(x)
。C)当
x
为待定承诺时:1.
return x
将返回挂起的承诺,并将在后续的then
上进行评估。在Promise.prototype.then() docs上阅读有关此主题的更多信息。
ycggw6v22#
规则是,如果
then
处理程序中的函数返回一个值,Promise使用该值进行解析/拒绝,如果函数返回Promise,则下一个then
子句将是The Promise the Function Return的then
子句,因此,在本例中,第一个示例遵循thens
的正常顺序并打印出值,在第二个示例中,当您执行Promise.resolve("bbb")
时返回的Promise对象则是链接时调用的then
。它的实际工作方式将在下面更详细地描述。引用承诺/A+规范:
承诺解析过程是以承诺和值作为输入的抽象操作,我们将其表示为
[[Resolve]](promise, x)
。**如果x
是一个使能,则它试图做出承诺采用x
的状态,假设x的行为至少有点像承诺。否则,它将使用值x
实现Promise。这种对thenables的处理允许Promise实现进行互操作,只要它们公开了符合Promises/A+的Then方法。它还允许Promises/A+实现用合理的Then方法“同化”不符合规范的实现。
这里需要注意的关键一点是这一行:
如果
x
是承诺,则采用其状态[3.4]链接:https://promisesaplus.com/#point-49
bgibtngc3#
您的两个示例的行为应该大体相同。
then()
处理程序内部返回的值成为从该then()
返回的承诺的解析值。如果.then
内部返回的值是承诺,则then()
返回的承诺将“采用”该承诺的状态,并像返回的承诺一样决定/拒绝。在第一个示例中,您在第一个
then()
处理程序中返回"bbb"
,因此"bbb"
被传递到下一个then()
处理程序。在第二个示例中,您返回一个承诺,该承诺立即用值
"bbb"
解析,因此"bbb"
被传递到下一个then()
处理程序。(这里的Promise.resolve()
是无关的)。结果是一样的。
如果你能给我们展示一个实际表现出不同行为的例子,我们就能告诉你为什么会发生这种情况。
flvlnr444#
你已经得到了一个很好的正式答复。我想我应该加上一个简短的。
以下内容与Promises/A+承诺相同:
Promise.resolve
(在您的Angular 中为$q.when
)new $q
。then
回调返回一个值。因此,对于承诺值或普通值X,以下所有条件都是相同的:
不足为奇的是,Promise规范基于Promise Resolve过程,该过程支持库之间的轻松互操作(如$Q和本机Promise),并使您的工作总体上更轻松。每当可能出现承诺解决方案时,解决方案就会出现,从而创造整体的一致性。
jgwigjjp5#
唯一的区别是,当你做
return Promise.resolve("bbb")
时,你正在创造一个不必要的承诺。从onFulfilled()
处理程序返回承诺开始promise resolution。这就是承诺链的工作原理。i86rm4rw6#
只是一点而已。正如您在调试器中看到的那样,‘Resolve’函数不会返回。如果这是最后一句话,它似乎会回来。“Resolve”将承诺设置为已满,但如果下面有更多语句,则继续执行。
你可以在这里读到:'Why does javascript ES6 Promises continue execution after a resolve?'
这让我非常困惑,因为在大多数例子中都没有解释。因此,从现在开始,我必须记住使用‘Return Resolve(Value)’或‘If Resolve(Value)Else...Other Code’,或者只使用‘Resolve’作为最后一条语句。