resolve()
下面的函数和函数是否真的是then()
ES6 Promise 机制中唯一查看并添加履行处理程序到作业队列的函数(并将它们标记为已添加且不再添加)?
let promise = new Promise(function(resolve, reject) {
console.log("resolve, reject are", resolve, reject);
setTimeout(function() {
resolve("this is the success data");
}, 1000);
});
promise.then(
function(a) {
console.log("Success.", a);
promise.then(function(a) { console.log("Go have a drink.", a); });
},
function(a) {
console.log("failure", a)
}
);
上述代码的替代方法resolve()
是直接完成,而不是在setTimeout()
. 是真的then(fn)
会为这个promise添加fn
到履行处理程序表(不是作业队列)中,还是如果promise已经解决了,直接添加fn
到作业队列中,并且fn
标记为“已经添加到作业队列中” " 并且不需要再次添加?
另一方面,这resolve()
是一个 JS ES6 提供的函数,它将一个 Promise 标记为“已解决”(状态),并检查该 Promise 的履行处理程序表是否为空。如果有这样的处理程序(并且之前不应该被标记为已添加到作业队列中),那么这些处理程序将被添加到作业队列中并标记为已添加。
在任何情况下,假设履行处理程序表中有fn1
, fn2
, fn3
, ... 等,每个都添加到作业队列中fn1(resolvedValue)
,调用resolvedValue
内部会记住resolve(resolveValue)
?
并且根本没有其他情况可以访问履行处理程序表。作业队列作业由 JS 事件循环执行,因此当所有 GUI“点击事件处理程序”等都完成后,作业队列中的履行(和拒绝)处理程序被执行,然后是 setTimeout 和 setInterval处理程序也被执行?这就是履行处理程序表和作业队列的工作方式吗?