在"然后"内回复承诺处理程序导致使用返回的Promise的分辨率值解析另一个不相关的Promise

时间:2018-03-09 14:56:54

标签: javascript promise

我一直试图弄清楚这一点,我想知道分辨率值是如何通过getAnswer then调用的。首先我return我认为add的结果会返回一个承诺,允许我对then上的then方法使用getAnswer调用,但是第二个return语句如何传递给它?



 function add(num1, num2) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {resolve(num1 + num2);}, 500)

  });
}

function getAnswer() {
  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?");
    });
  });
}

getAnswer().then((res) => {
  console.log(res);
})




1 个答案:

答案 0 :(得分:1)

基础:

add返回一个Promise - 这是Promise对象的一个​​实例,Promise的每个实例都有一个then方法,您可以用它来观察该承诺分辨率。
出于链接的目的,then的设计方式是它本身返回一个Promise(因此,JavaScript中的每个then调用都将返回一个新的promise)。 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的结果,您通过在then的结果上调用add来返回您创建的承诺(这只是标准的JS行为)。

您的问题:

  

但是第二个return语句是如何传递给它的呢?

以下是then方法返回的内容,根据MDN(([])中的部分是我的添加内容):

  

待处理状态中的承诺([这是您的第一个return语句实际返回的内容])。然后处理函数(onFulfilled或onRejected)异步调用([示例中的处理程序是您传递给then内的getAnswer]的函数)。在调用处理函数之后,如果处理函数:

     
      
  • 返回一个值,然后返回的promise将以返回值作为其值进行解析;
  •   
  • 抛出错误,然后返回的promise将被抛出错误作为其值被拒绝;
  •   
  • ([这是您的情况 - 您的第二个return])返回已经解决的承诺,然后返回的承诺将以该承诺的值作为其值解析;
  •   
  • 返回已经被拒绝的承诺,然后返回的承诺将被拒绝,并将该承诺的值作为其值。
  •   
  • 返回另一个待处理的promise对象,当时返回的promise的解析/拒绝将在处理程序返回的promise的解析/拒绝之后。此外,then返回的promise的值将与处理程序返回的promise的值相同。
  •   

就个人而言,每当我看到then的处理程序返回Promise时,我只是假设 - 为了简化我的想法 - 最初由then返回的Promise已经被then的一个处理程序刚刚返回的Promise所取代。当然,这种心理映射与实际功能AFAIK平行。

所以,总结一下:

  1. getAnswer返回由add(5, 5).then(...)创建的承诺。
  2. 然后使用thengetAnswer().then(...))观察返回的承诺 - 此处无关,但此调用也会创建承诺。
  3. 发生了add调用返回的观察承诺的处理程序(此处理程序是您在#1中传递给then的函数),也会返回一个承诺和规则如果then的处理程序返回一个承诺p,那么每当p使用值v解析时,原始承诺 - 由then创建 - 也将通过v解决。
  4. 最后,您传递给#2中的then以观察getAnswer()返回的承诺的处理程序将使用#3中的值v进行调用。
  5. <小时/> 请随时要求澄清,但在此之前,请仔细阅读this文章。