【发布时间】:2019-08-18 00:59:09
【问题描述】:
我正在努力更好地理解承诺。 我正在对 API 进行异步调用,然后根据响应,我想做更多操作,为此我使用以下 2 种方法:
方法一:
function getABValues(){
getValueOfA() /*this returns aOutput*/
.then(function (aOutput){
getValueOfB() /*this returns bOutput*/
})
.then(function (bOutput){
console.log(bOutput);
})
}
方法2:
function getABValues(){
return getValueOfA() /*this returns aOutput*/
.then(function (aOutput){
return getValueOfB() /*this returns bOutput*/
})
.then(function (bOutput){
console.log(bOutput);
})
}
这里是函数 getValueOfA() 和 getValueOfB():
getValueOfA()
function getValueOfA(){
return aOutput;
}
getValueOfB():
function getValueOfB(){
return bOutut;
}
如果您注意到getValueOfA() 和getValueOfB() 已经在返回值,那么在调用getValueOfA() 和getValueOfB() 之前是否还需要使用return 才能使用then。
方法 1 不使用 return,而方法 2 使用 return。
感谢澄清
【问题讨论】:
-
代码不等价,因为在方法 1 中,bOutput 将是未定义的,因为上一步没有返回 getValueOfB() 。只有当
aOutput已经是一个promise 时才有意义,因为否则getValueOfA() 将不会返回您可以将.then()链接到的东西。所以答案是:如果您希望返回的内容可用作链接到它的下一个.then()的参数,则始终必须在.then()处理函数中返回。 -
如果 getValueOfA() 返回一个承诺,那么如果我在调用 getValueOfA() 时添加另一个返回,因为它已经返回,会不会有问题?
-
为了清楚起见,
aOutput和bOutput最好命名为aPromise和bPromise。如果它们不是 thenable(很可能是 Promises),那么getValueOfA().then(...)和getValueOfB().then(...)会抛出。 -
不,每个函数都可以(并且可能应该)有自己的返回值。这(通常)包括
.then()回调函数。 -
回报至关重要。 .then() 回调函数传递值(或传递最终将传递值的 Promise)的唯一方法是让该回调返回。如果它没有返回任何东西,那么它将一如既往地返回
undefined。无论返回什么都会被传递到承诺链的下一个阶段。
标签: javascript jquery asynchronous promise callback