首页 > 编程语言 >zone.js由入门到放弃之三——zone.js 源码分析【setTimeout篇】

zone.js由入门到放弃之三——zone.js 源码分析【setTimeout篇】

时间:2023-09-06 18:03:38浏览次数:43  
标签:task zone Zone js Task 源码 setTimeout

Delegate是个好东西,看看孙啸达 同学对ZoneDelegate的介绍吧,这是他关于zone.js系列文章的第三篇~

zone.js系列往期文章

zone.js源码分析

接下来的全是干货,从头到尾,一干到底

zone.js由入门到放弃之三——zone.js 源码分析【setTimeout篇】_前端

一点前置:Zone 和 ZoneDelegate

在前文中,我们一直在回避讲解Zone和ZoneDelegate之间的区别。尤其在上篇文章讲API的时候,我甚至让大家把这两者当成一回事。其实这两者并不是完全相等的。单从Delegate这个单词你也能看出,虽然Zone和ZoneDelegate的API很像,但是真正干活的是ZoneDelegate。我简单节选几段Zone的源码,大家不难发现,大多数Zone的API都直接或间接通过代理中相对应的API完成的。

public fork(zoneSpec: ZoneSpec): AmbientZone {
    // 此处省略成吨源码
    return this._zoneDelegate.fork(this, zoneSpec);
}

public run<T>(callback: (...args: any[]) => T, applyThis?: any, applyArgs?: any[], source?: string): T {
    // 此处省略成吨源码
    return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
}

runTask(task: Task, applyThis?: any, applyArgs?: any): any {
    // 此处省略成吨源码
    return this._zoneDelegate.invokeTask(this, task, applyThis, applyArgs);
}

我把上篇文章讲到的API和ZoneDelegate之间的调用关系简单梳理了一下。下文在分析源码的时候,会有大量Zone、ZomeDelegate、ZomeTask三者之间相互调用的场景,实在理不清的地方可以返回这里看下。

zone.js由入门到放弃之三——zone.js 源码分析【setTimeout篇】_前端_02

虽然ZoneDelegate实际承担了大量的工作,但是Zone也不是甩手掌柜,啥活儿也不干。在我个人看来,Zone其实主要只负责两件事:

  • 维护Zone的上下文栈:我们知道Zone是个具有继承关系的链式结构。zone.js在全局会维护一个Zone栈帧,每当我们在某个Zone中执行代码时,Zone要负责将当前的Zone上下文置于栈帧中;当代码执行完毕,又要负责将Zone栈帧恢复回去。
public run<T>(callback: (...args: any[]) => T, applyThis?: any, applyArgs?: any[], source?: string): T {
    // 将当前的Zone上下文置于栈帧中
    _currentZoneFrame = {parent: _currentZoneFrame, zone: this};
    try {
        ...
    } finally {
        // 恢复Zone栈帧
        _currentZoneFrame = _currentZoneFrame.parent!;
    }
}
  • Zone还负责ZoneTask的状态切换。上文说过,Zone可以对宏任务、微任务、事件进行管理。那么每个任务在Zone中处于何种阶段、何种状态也是由Zone负责的。Zone会在适当时候调用ZoneTask的_transitionTo方法切换ZoneTask的状态。

接下来会把zone.js对setTimeout的Patch过程进行详细的说明,为了方便理解,其中涉及的大量源码都是我简化之后。


第一阶段:zone.js打包setTimeout

Patch第一站

zone.js提供一个静态方法用于Patch我们常见的API,对setTimeout的Patch位于zone.js/lib/browser/browser.ts下:其中这个patchTimer(global, set, clear, 'Timeout');就是本次源码分析的起点。

代码传送门

Zone.__load_patch('timers', (global: any) => {
    const set = 'set';
    const clear = 'clear';
    patchTimer(global, set, clear, 'Timeout');	

标签:task,zone,Zone,js,Task,源码,setTimeout
From: https://blog.51cto.com/u_16152776/7389084

相关文章

  • [SpringSecurity5.6.2源码分析三]:SpringWebMvcImportSelector
    1、SpringWebMvcImportSelector• SpringSecurity支持在SpringMVC进行参数解析的时候填充参数,支持以下的对象• 通过@AuthenticationPrincipal,获取UserDetails• 通过@CurrentSecurityContext,获取SecurityContext• 通过参数类型为CsrfToken获取CsrfToken• 究其原因是因为Spr......
  • 小程序中格式化JSON数据中的日期
    小程序中格式化JSON数据中的日期 //假设原始JSON数据为constoriginalJson={name:'JohnDoe',birthdate:'1990-01-01'};//将日期格式化为标准的ISO8601格式constformattedJson={};Object.keys(originalJson).forEach(key=>{if(key==='birthdate......
  • 开课吧前端1期.阶段2:ES6详解-3 面向对象 JSON
    7、面向对象-基础//原来写法functionUser(name,pass){//这就是一个类this.name=name;this.pass=pass;}User.prototype.showName=function(){alert(this.name)};User.prototype.showPass=function(){alert(this.pass)};varu1=newUser('blue','111......
  • 使用Nodejs的addon导入cpp生成的dll时出现的问题记录
    在使用Nodejs的addon导入自己编写的cpp的dll时出现的一系列问题记录标签:__declspec、Napi、LoadLibraryA、GetLastError、dumpbin/exports。正常创建一个使用Napi的nodejsaddon项目(网上都有,在这里不赘述),主要代码如下:#include<napi.h>#include<iostream>#include<atlst......
  • vuejs3.0 从入门到精通——初始化项目——项目结构
    初始化项目——项目结构 项目结构是项目的整体展现,也是对不同文件和文件夹的业务模块的划分。随着业务需求的迭代,项目会不断地增加业务模块,建立业务模块文件,使项目结构清晰、方便管理,这是很重要的。这个目录结构是使用VueCLI创建的Vue.js项目,其中包含了一些常用的文件和......
  • 软件测试|Python对JSON的解析和创建详解
    简介JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,已经成为当今互联网应用中广泛使用的数据格式之一。Python提供了内置的模块来解析和创建JSON数据,使得在Python中处理JSON变得非常简单。本文将详细介绍Python对JSON的解析和创建过程,并提供示例代码来帮助大家更好地理......
  • vue3集成jsoneditor
    一、背景之前在做录制回放平台的时候,需要前端展示子调用信息,子调用是一个请求列表数组结构,jsoneditor对数组的默认展示结构是[0].[1].[2]..的方式,为了达到如下的效果,必须用到onNodeName的钩子函数,因此深入调研了下vue3如何集成jsoneditor最后做出来的效果图onNodeName的参考......
  • Spring源码分析(十一)ApplicationContext详细介绍(上)
    在前面的文章中,已经完成了官网关于IOC内容核心的部分。包括容器的概念,Spring创建bean的模型BeanDefinition的介绍容器的扩展点(BeanFactoryProcessor,FactoryBean,BeanPostProcessor)以及最重要的bean的生命周期等。接下来大概还有花三篇文章完成对官网中第一大节的其他内容,之所以要......
  • 二级医院信息系统源码(HIS) Angular+Nginx+ Java
    基层医疗云HIS作为基于云计算的B/S构架的HIS系统,为基层医疗机构提供了标准化的、信息化的、可共享的医疗信息管理系统,可有效进行医疗数据共享与交换,解决数据重复采集及信息孤岛等问题,实现对基层医疗数据的分析和挖掘,为基层卫生机构提供科学合理的业务管理服务。可实现“云部署”,即......
  • vuejs3.0 从入门到精通——项目创建
    项目创建 完成VueCLI脚手架的安装后,即可快速构建一个全新Vue.js项目,包括可初始化项目的整体结构、依赖包、插件等相关工作。一、命令构建项目1.1、创建项目:[root@JumperServer:project_vue]#vuecreatevue3-element-plus-adminVueCLIv5.0.8?Pleasepickapr......