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方法,该方法返回全新的承诺对象 - 让我们称之为nextpromise
。 nextpromise
的状态为:pending
,值为undefined
如果在1000毫秒后调用runOnTimerCompletion,resolve
会运行 - 将originalpromise
状态更新为resolved
,将originalpromise
值更新为"Timer complete"
此时onFulfilment
已执行 - onFulfilment()
- 并返回"Timer complete"
。我们的nextpromise
现已拥有状态:resolved
和价值:"Timer complete"
三个问题:
onFulfilment
的分辨率上调用的originalpromise
函数在哪里存储?originalpromise
和nextpromise
存放在哪里 - 因为他们未被分配到任何内容。 onFulfilment
如何知道在originalpromise
分辨率上执行。它是由originalpromise
引用还是originalpromise
的决议指示nextpromise
其已解决
这就是启动onFulfilment
答案 0 :(得分:1)
在存储的originalpromise的分辨率上调用的onFulfilment函数在哪里?
它存储在调用了.then()
处理程序的promise的实例数据中。当承诺得到解决后,它将按照注册顺序调用每个.then()
处理程序。
存在originalpromise和nextpromise的位置 - 因为它们没有分配给任何东西。
在您的代码中,原始承诺并未特别“存储”在任何地方。它不是立即收集的垃圾,因为executor
范围仍然存在(由于setTimeout()
)和实时代码仍然可以调用的resolve()
实现具有对原始承诺的引用
传递给executor函数的与(2)相关 - onFulfilment如何知道在originalpromise解析上执行。它是由originalpromise引用还是originalpromise的解决方案指示nextpromise它已解决,这是什么启动onFulfilment的执行
resolve
引用了它所属的承诺。
答案 1 :(得分:0)
确实,你没有new Promise
的直接引用变量,但是你不需要声明一个变量来操作它。例如,它就像
document.querySelector('div').addEventListener(...
对所选div的引用不会保存在变量中,但您仍然可以对同一行上的对象进行操作。
nextpromise
引用确实丢失了:你基本上宣称它(
new Promise(executor).then(onFulfilment);
)
并且不要将它分配给任何东西,因此以后无法获得它。 承诺对象仍然存在,它只是不可能引用。