下面的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)
}
);
上面代码的另一种选择是,不在setTimeout()中直接执行resolve()。then(fn)是否会将fn添加到该promise的实现处理程序表(而不是作业队列),或者如果promise已经解析,则直接将fn添加到作业队列,并将fn标记为“已添加到作业队列”,不需要重新添加?
另一方面,resolve()是JS ES6提供的函数,它将一个promise标记为"resolved“(状态),并检查此promise的履行处理程序表是否为空。如果存在这样的处理程序(并且之前不应该标记为已添加到作业队列中),则将这些处理程序添加到作业队列中,并标记为已添加。
在任何情况下,假设有fn1,fn2,fn3,...等在实现处理程序表中,每个resolvedValue都作为fn1(resolvedValue)添加到作业队列中,其中resolvedValue由resolve(resolveValue)调用在内部记住?
并且根本不存在访问实现处理程序表的其他情况。作业队列作业由JS事件循环执行,因此当所有图形用户界面“单击事件处理程序”等完成后,作业队列中的实现(和拒绝)处理程序将被执行,然后setTimeout和setInterval处理程序也将被执行?这是实现处理程序表和作业队列的工作方式吗?
发布于 2019-12-25 18:11:01
下面的
resolve()函数和then()函数是ES6 Promise机制中查看实现处理程序并将其添加到作业队列的唯一函数,这是真的吗?
是。(reject还查看该表并删除处理程序,而不将其添加到作业队列中)。
then(fn)是否会将fn添加到此promise的实现处理程序表(而不是作业队列),或者如果promise已经解析,则直接将fn添加到作业队列?
是。
且该
fn被标记为“已添加到作业队列”,不需要重新添加?
不,fn根本没有标记。它可能会被多次传递给then,在这种情况下,它将需要多次运行。
但是,是的,当promise实现并调度回调作业时,实现处理程序表将被清除。
在任何情况下,假设有fn1,fn2,fn3,...等在实现处理程序表中,每个resolvedValue都作为fn1(resolvedValue)添加到作业队列中,其中resolvedValue由resolve(resolveValue)调用在内部记住?
是。虽然从技术上讲是resolve does not always fulfill the promise。
,并且根本不存在访问实现处理程序表的其他情况。
是。我想知道你为什么这么在意。
点击作业队列作业是由JS事件循环执行的,所以当所有的图形用户界面“点击事件处理程序”等完成后,作业队列中的实现(和拒绝)处理程序就会被执行,然后setTimeout和setInterval处理程序也会被执行?这是实现处理程序表和作业队列的工作方式吗?
是。但是,请注意click handlers, setTimeout and setInterval have a separate event queue from promise jobs。
https://stackoverflow.com/questions/59476887
复制相似问题