new Promise(executor).then(onFulfilment);

function executor (resolve, reject) {
  function runOnTimerCompletion(){
    resolve("Timer complete")
  }
  setTimeout(runOnTimerCompletion, 1000);
}

function onFulfilment(input){
  console.log(input)
  return input
}


对Promise构造函数的调用返回一个Promise对象(我们称其为originalpromise)。 originalpromise具有状态:pending和值:undefined

在第1行中,我们立即在originalpromise对象上调用then方法,该方法返回一个全新的promise对象-我们将其称为nextpromisenextpromise具有状态:pending和值:undefined

在1000ms之后调用runOnTimerCompletion时,resolve运行-将originalpromise状态更新为resolved,将originalpromise值更新为"Timer complete"

此时执行onFulfilment-onFulfilment()-并返回"Timer complete"。我们的nextpromise现在具有状态:resolved和值:"Timer complete"

三个问题:


onFulfilment分辨率下调用的originalpromise函数存储在哪里?
originalpromisenextpromise的存储位置-假设它们未分配任何内容。
与(2)有关-onFulfilment如何知道以originalpromise分辨率执行。是由originalpromise引用还是originalpromise的分辨率指示nextpromise已解决
这就是开始执行onFulfilment的原因

最佳答案

在原始承诺的解决方案上调用的onFulfilment函数存储在哪里?


它存储在被调用.then()处理程序的Promise的实例数据中。兑现承诺后,它将按注册的顺序调用每个.then()处理程序。


  由于未将originalpromise和nextpromise分配给任何对象,因此它们存储在哪里。


在您的代码中,原始承诺不会“存储”在任何特定的地方。由于executor范围仍然处于活动状态(由于setTimeout()),并且仍可由实时代码调用的resolve()实现引用了原始的Promise,因此不会立即进行垃圾收集。


  与(2)有关-onFulfilment如何知道如何以原始的承诺分辨率执行。它是由originalpromise引用还是由originalpromise的解决方案指示nextpromise解决,这就是onFulfilment的执行的开始


传递给执行程序函数的resolve引用了与它有关的Promise。

09-07 12:42