Javascript 在“内部”中返回承诺;然后";处理程序使用返回的承诺解决另一个不相关的承诺';s分辨率值
我一直在尝试解决这个问题,我想知道分辨率值是如何通过Javascript 在“内部”中返回承诺;然后";处理程序使用返回的承诺解决另一个不相关的承诺';s分辨率值,javascript,promise,Javascript,Promise,我一直在尝试解决这个问题,我想知道分辨率值是如何通过getAnswer的调用传递的。首先,我return添加的结果,我认为它返回了一个承诺,允许我使用然后调用然后方法getAnswer,但是第二个return语句是如何传递给它的呢 函数添加(num1,num2){ 返回新承诺((解决、拒绝)=>{ setTimeout(()=>{resolve(num1+num2);},500) }); } 函数getAnswer(){ 返回add(5,5)。然后((res)=>{ 控制台日志(res); 返
getAnswer
的调用传递的。首先,我return
添加的结果,我认为它返回了一个承诺,允许我使用然后调用然后方法getAnswer
,但是第二个return
语句是如何传递给它的呢
函数添加(num1,num2){
返回新承诺((解决、拒绝)=>{
setTimeout(()=>{resolve(num1+num2);},500)
});
}
函数getAnswer(){
返回add(5,5)。然后((res)=>{
控制台日志(res);
返回新承诺((解决、拒绝)=>{
解析(“这是如何通过getAnswer的then函数的?”);
});
});
}
getAnswer()。然后((res)=>{
控制台日志(res);
})
基础知识:
add
返回一个Promise——它是Promise
对象的一个实例,Promise
的每个实例都有一个then
方法,可用于观察该Promise的解析。
出于链接的目的,then
的设计方式使其本身返回一个承诺(因此,JavaScript中的每个then
调用都将返回一个新的承诺)。然后,返回的承诺将使用其处理程序的返回值进行解析(稍后将对此进行详细介绍)
现在,当你说:
return add(5, 5).then((res) => {
console.log(res);
return new Promise((resolve, reject) => {
resolve("How does this get passed too getAnswer's then function?");
});
});
您没有返回add
的结果,而是返回通过调用然后在add
的结果上创建的承诺(这只是标准的JS行为)
您的问题:
但是第二个return语句是如何传递给它的呢
根据MDN,下面是然后
方法返回的内容(([])
中的部分是我添加的内容):
处于挂起状态的承诺([这是您的第一个return
语句实际返回的内容])。然后异步调用处理程序函数(onCompleted或onRejected)([示例中的处理程序是传递给然后内部getAnswer
]的函数)。调用处理程序函数后,如果处理程序函数:
- 返回一个值,然后以返回的值作为其值解析返回的承诺李>
- 抛出一个错误,然后返回的承诺被拒绝,抛出的错误作为其值李>
- ([这是您的案例--您的第二个
返回值
])返回一个已解决的承诺,然后返回的承诺将以该承诺的值作为其值得到解决李>
- 返回一个已经被拒绝的承诺,然后返回的承诺将以该承诺的值作为其值被拒绝
- 返回另一个挂起的承诺对象,则返回的承诺的解决/拒绝将在处理程序返回的承诺的解决/拒绝之后进行。此外,then返回的承诺值将与处理程序返回的承诺值相同
就我个人而言,每当我看到then
的处理程序返回一个承诺时,为了简化我的想法,我只是假设then
返回的承诺最初已经被一个then
的处理程序返回的承诺所取代。当然,这种心理映射与实际功能AFAIK是平行的
总而言之:
getAnswer
返回一个承诺——由add(5,5)创建。然后(…)
然后使用then
(getAnswer().then(…)
)观察返回的承诺——此处不相关,但此调用也创建了一个承诺李>
用于观察add
调用返回的承诺的处理程序(此处理程序是传递给然后在#1中传递给的函数)也会返回一个承诺,规则是如果的处理程序返回一个承诺p
,然后,每当用值v
解析p
时,由then
创建的原始承诺也将用v
解析
最后,传递给#2中的
然后
的处理程序将使用#3中的值v
调用
,以遵守getAnswer()
返回的承诺
请随时询问任何澄清,但在这样做之前,请仔细阅读文章。您所说的“它是如何传递的”是什么意思?回答:在a函数参数中-就像您的代码中所演示的那样(请参见res
),我不明白第二个返回语句(返回新承诺((解析,拒绝))是什么意思正在传递到。然后这就是承诺的工作方式…“首先我返回add
的结果”-不,你没有。你返回add(…)的结果。然后(…)
。