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(…)的结果。然后(…)