1

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处理程序也被执行?这就是履行处理程序表和作业队列的工作方式吗?

4

1 回答 1

1

resolve()下面的函数和函数是否真的是then()ES6 Promise 机制中唯一查看并添加履行处理程序到作业队列的函数?

是的。(reject还查看表并删除处理程序而不将它们添加到作业队列中)。

是否then(fn)会将此承诺添加fn到履行处理程序表(而不是作业队列)中,或者如果承诺已经解决,则直接将 添加fn到作业队列中?

是的。

并且fn被标记为“已经添加到作业队列”并且不需要再次添加?

不,fn根本没有标记。它可以多次传递给then,在这种情况下,它需要运行多次。
但是是的,当 Promise 完成并安排回调作业时,就会清除完成处理程序表。

在任何情况下,假设履行处理程序表中有fn1, fn2, fn3, ... 等,每个都添加到作业队列中fn1(resolvedValue),调用resolvedValue内部会记住resolve(resolveValue)?

是的。虽然在技术上resolve并不总能兑现承诺

并且根本没有其他情况可以访问履行处理程序表。

是的。我想知道你为什么在乎。

作业队列作业由 JS 事件循环执行,因此当所有 GUI “点击事件处理程序”等都完成后,作业队列中的履行(和拒绝)处理程序被执行,然后是 setTimeout 和 setInterval处理程序也被执行?这就是履行处理程序表和作业队列的工作方式吗?

是的。但是请注意click 处理程序,setTimeout并且setInterval有一个与 promise jobs 分开的事件队列

于 2019-12-25T10:11:00.920 回答