未分配的承诺及其关联的处理程序存储在何处

时间:2018-03-25 23:48:28

标签: javascript promise es6-promise

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方法,该方法返回全新的承诺对象 - 让我们称之为nextpromisenextpromise的状态为:pending,值为undefined

如果在1000毫秒后调用runOnTimerCompletion,resolve会运行 - 将originalpromise状态更新为resolved,将originalpromise值更新为"Timer complete"

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

三个问题:

  1. onFulfilment的分辨率上调用的originalpromise函数在哪里存储?
  2. originalpromisenextpromise存放在哪里 - 因为他们未被分配到任何内容。
  3. 与(2)相关 - onFulfilment如何知道在originalpromise分辨率上执行。它是由originalpromise引用还是originalpromise的决议指示nextpromise其已解决 这就是启动onFulfilment
  4. 执行的原因

2 个答案:

答案 0 :(得分:1)

  

在存储的originalpromise的分辨率上调用的onFulfilment函数在哪里?

它存储在调用了.then()处理程序的promise的实例数据中。当承诺得到解决后,它将按照注册顺序调用每个.then()处理程序。

  

存在originalpromise和nextpromise的位置 - 因为它们没有分配给任何东西。

在您的代码中,原始承诺并未特别“存储”在任何地方。它不是立即收集的垃圾,因为executor范围仍然存在(由于setTimeout())和实时代码仍然可以调用的resolve()实现具有对原始承诺的引用

  

与(2)相关 - onFulfilment如何知道在originalpromise解析上执行。它是由originalpromise引用还是originalpromise的解决方案指示nextpromise它已解决,这是什么启动onFulfilment的执行

传递给executor函数的

resolve引用了它所属的承诺。

答案 1 :(得分:0)

确实,你没有new Promise的直接引用变量,但是你不需要声明一个变量来操作它。例如,它就像

document.querySelector('div').addEventListener(...

对所选div的引用不会保存在变量中,但您仍然可以对同一行上的对象进行操作。

nextpromise引用确实丢失了:你基本上宣称它( new Promise(executor).then(onFulfilment);

并且不要将它分配给任何东西,因此以后无法获得它。 承诺对象仍然存在,它只是不可能引用。