首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Javascript中,异步函数(例如定时器)是如何处理的?

问在Javascript中,异步函数(例如定时器)是如何处理的?
EN

Stack Overflow用户
提问于 2020-06-18 19:59:17
回答 1查看 191关注 0票数 1

我们知道承诺是微任务,它们被添加到微任务队列中,事件监听器/定时器是任务,所以它们被添加到任务队列中。但是,如果事件侦听器/定时器在允诺函数中(这个函数是在承诺构造函数的创建过程中传递的),那么事件侦听器/定时器怎么办?它们被添加到哪个队列中?

​

代码语言:javascript
复制
console.log("script start");

var promise = new Promise(function (resolve, reject) {
	setTimeout(function () {
		console.log("setTimeout2");
		resolve();
	}, 0);
});
promise.then(function () {
	console.log("promise2");
});
setTimeout(function () {
	console.log("setTimeout");
}, 0);
console.log("script end");

​

在这里,“脚本开始”是主要任务的一部分,因此它将被执行/打印。

然后将承诺的回调函数处理为browser,处理程序将其添加到microtask队列中。

然后()将回调传递给浏览器的处理程序,它将在解决主承诺后执行。

超出承诺的setTimeout被添加到任务队列中。

“脚本端”被打印出来。

现在,微任务队列上有一个微任务,任务队列上有一个任务。

因此,微任务将首先执行,因为它们比任务具有更高的优先级。

但是在任务里面有一个计时器。

我们知道定时器被添加到任务队列中。但是在这里,我认为计时器被添加到微任务队列中。因为如果它被添加到任务队列中,那么"setTimeout2“稍后会被打印出来,因为在任务队列中已经有一个输出"setTimeout”的任务。那么那里到底发生了什么呢?

EN

回答 1

Stack Overflow用户

发布于 2020-06-18 20:55:58

“承诺中”没有什么特别之处。放在微任务队列上的唯一函数是传递到then的回调。

下面是实际发生的事情:

,

  1. ,script start日志被执行,
  2. ,承诺被创建,并调用它的执行器回调。执行器回调调用setTimeout,它调度一个定时器。
  3. 将承诺分配给promise变量
  4. ,调用then()方法并将一个实现回调附加到承诺
  5. ,调用第二个setTimeout并调度第二个定时器H 216H 117执行script end日志H 219G 220

所有这些都是在一个任务执行过程中同步发生的。过了一段时间,定时器就开火了(只有这样!)将其(宏)任务添加到计时器事件队列中。浏览器处理第一个浏览器:

  1. 执行setTimeout2日志,执行
  2. ,执行resolve()函数,履行承诺,并添加作业以运行对微任务队列

的实现回调

完成此宏任务后,微任务队列中的任务将被处理:

  1. promise2日志被执行

由于microtask队列已经为空,因此可以处理下一个宏任务:

  1. setTimeout日志被执行
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62458424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档