当前位置: 首页 > Web前端 > JavaScript

[JS] setTimeout的异步操作如何实现

时间:2023-03-27 13:08:08 JavaScript

[JS]如何实现setTimeout的异步操作核心有3个:同步事件消息队列、异步事件消息队列、事件循环系统。(以下简称同步队列、延迟队列、事件循环)浏览器中有一个同步事件消息队列。所有运行在主线程上的任务都需要先加入到同步队列中,然后事件循环系统在队列中的任务中按顺序执行消息。不考虑异步事件,同步事件的流程如下。同步队列:task_queuesync_task1、sync_task2、sync_task3、...事件周期:getSyncTask;//(sync_task1)processSyncTask;getSyncTask;//(sync_task2)processSyncTask;getSyncTask;//(sync_task3)processSyncTask;第一次执行同步任务后,会获取到异步任务(可能获取不到)。事件循环的流程如下。同步队列:task_queuesync_task1、sync_task2、sync_task3、...延迟队列:delay_task_queueasync_task事件周期:getSyncTask;//(sync_task1)processSyncTask;getAsyncTask;//没有结果(比如延迟时间还没有)getSyncTask;//(sync_task2)processSyncTask;获取异步任务;//(async_task)processAsyncTask;//执行一个异步事件getSyncTask;//(sync_task3)processSyncTask;getAsyncTask;//没有异步事件;当通过JavaScript调用setTimeout设置回调函数时,渲染进程会创建一个回调任务,包括回调函数名、currentTime、delayTime;创建回调任务后,将任务加入延迟执行队列;另外还要注意getAsyncTask和processAsyncTask的执行时机,在上面的例子中,处理完同步队列中的一个任务后,会执行getAsyncTask函数。getAsyncTask函数会根据启动时间和延迟时间计算出到期任务,然后依次执行这些到期任务。完成应有的任务后,继续进行下一个循环过程。如果同步任务耗时过长,异步任务的执行事件可能不会比设置的延迟时间长很多。同步更新到你的语雀https://www.yuque.com/diracke...