我读了很多关于诺言的文章。我知道,promise执行是任务队列的微任务,异步代码执行是任务队列的任务。在保证异步代码工作同步代码之后(即经过一些提取后,我们可以在.then块中编写同步代码)的诺言中如何发生?我猜想promise中的所有代码都使用调用栈(如果Promise主体中为同步代码)或任务队列(如果Promise主体中为异步代码)。我看到了很多带有调用堆栈,Web API和带有setTimeout代码的任务队列的示例,但是它如何与我只能承担的承诺一起使用。您能否在我的示例中显示调用堆栈,Web API和任务队列会发生什么情况?
第一个例子:
const promiseWithAsyncBody = new Promise(resolve=>
setTimeout(()=> resolve('resolved'), 0));
promiseWithAsyncBody.then(msg=> console.log(msg));
我猜想promise主体进入任务队列,然后进入调用堆栈,当代码进入setTimeout时,setTimeout进入WebAPI并立即进入任务队列,但与此同时,然后块进入任务队列。之后将触发setTimeout,并且仅在setTimeout触发.then块之后。
第二个例子:
const promiseWithSyncBody = new Promise(resolve=> resolve('resolved'));
promiseWithAsyncBody.then(msg=> console.log(msg));
我猜答应主体在调用堆栈中执行,直到执行为止。然后块进入任务队列。当callstack为空时,.then块将执行。
我对吗?请详细说明谁知道。谢谢!
创建承诺时
const promise = new Promise(/*executorFunction*/ (resolve, reject) =>
{/* executor function body */}
)
executorFuncton
的主体正在立即执行。在执行程序函数的内部,您可以调用或可以不调用一些异步api。
刚刚创建承诺后,它处于“待处理”状态。如果在执行程序功能内部的resolve callback中被调用,则promise的状态将变为“已实现”(如果调用拒绝回调,则可能变为“被拒绝”)。
并且只有在实现诺言之后,才会创建微任务(包装您在then()
调用中提供的回调),并由浏览器推送到微任务队列中。任务队列和微任务之间的可观察到的区别是,微任务队列中的任务总是在任务队列中的任务之前运行。这也是我对这个主题感兴趣时在互联网上找到的有关微任务和任务队列的唯一清晰信息。