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对象-我们将其称为nextpromise
。 nextpromise
具有状态:pending
和值:undefined
在1000ms之后调用runOnTimerCompletion时,
resolve
运行-将originalpromise
状态更新为resolved
,将originalpromise
值更新为"Timer complete"
此时执行
onFulfilment
-onFulfilment()
-并返回"Timer complete"
。我们的nextpromise
现在具有状态:resolved
和值:"Timer complete"
三个问题:
在
onFulfilment
分辨率下调用的originalpromise
函数存储在哪里?originalpromise
和nextpromise
的存储位置-假设它们未分配任何内容。与(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。