幕后的承诺(调用堆栈、Web API、任务队列)



我读了很多关于承诺的文章。我知道承诺执行是任务队列的微任务,异步代码执行是任务队列的任务。在异步代码工作同步代码后(即经过一些获取后,我们可以在 .then block 中编写同步代码(的承诺中是如何发生的? 我猜 promise 中的所有代码都使用 callstack(如果 promise 正文中的同步代码(或任务队列(如果 promise 正文中的异步代码(。我看到了很多带有setTimeout代码的调用堆栈,Web API和任务队列的示例,但是它如何与承诺一起工作,我只能假设。 你能在我的示例中展示调用堆栈、Web API 和任务队列会发生什么吗?

第一个例子:

const promiseWithAsyncBody = new Promise(resolve=> 
setTimeout(()=> resolve('resolved'), 0));
promiseWithAsyncBody.then(msg=> console.log(msg));

我猜 promise body 进入任务队列,然后进入调用堆栈,当代码进入 setTimeout 时,setTimeout 进入 WebAPI 并立即进入任务队列,但同时 .then 块进入任务队列。之后触发设置超时,并且仅在设置超时触发.then阻止之后。

第二个例子:

const promiseWithSyncBody = new Promise(resolve=> resolve('resolved'));
promiseWithAsyncBody.then(msg=> console.log(msg));

我猜承诺正文在调用堆栈中执行,直到执行 .then 块进入任务队列。当调用堆栈为空时,.then 块执行。

我说的对吗?请更详细地解释谁知道。谢谢!

当您创建承诺时

const promise = new Promise(/*executorFunction*/ (resolve, reject) =>
{/* executor function body */}
)

executorFuncton的尸体马上被处决。 在执行器函数的主体中,您可能会也可能不会调用某些异步 api。

刚刚创建承诺后,它将处于"挂起"状态。 如果在执行器函数解析回调内部被调用,则承诺的状态变为"已实现"(或者如果调用拒绝回调,则可能会变为"拒绝"(。

只有在承诺实现后,微任务才会被装箱(包装您在then()调用中提供的回调(,并通过浏览器推送到微任务队列中。 任务队列和微任务之间的明显区别在于,微任务队列中的任务总是 在任务队列中的任务之前运行。这也是我对这个话题感兴趣时在互联网上找到的关于微任务和任务队列的唯一明确信息。

最新更新