关于NodeJS中的循环引用详解


Posted in NodeJs onJuly 23, 2019

最近在用node的时候排查一个问题排查了半天,最终发现是循环引用导致的问题,故在此记录一下。

场景复现

出现问题场景比较简单,一共四个类:

  • parent.ts
  • child.ts
  • child_2.ts
  • util.ts
export abstract class Parent {

 abstract hello(): string;
}
import {Parent} from "./parent";

export class Child extends Parent {

 hello(): string {
  return "child";
 }

}
import {Child} from "./child";

export class Util {

 static useChildInSameCase(): string {
  let child: Child;
  return child.hello();
 }
}
import {Parent} from "./parent";

export class Child_2 extends Parent {

 hello(): string {
  return "child_2";
 }

}

这个时候我们去构造一个Child类:

import {Child} from "./child";

console.log(new Child().func());

就会直接报错了:

class Child_2 extends parent_1.Parent {
^

TypeError: Class extends value undefined is not a function or null

#寻找原因

说的是这个父类是一个undefined,很明显就是没有初始化。

一开始我觉得很奇怪,明明在child_2这个文件里已经import了parent,为什么会是undefined呢?后来debug查了一下代码的堆栈,恍然大悟:

入口文件->child.ts->parent.ts->util.ts->child_2.ts->parent.ts

很明显这里存在着一个循环引用,当我们在加载child_2.ts这个文件的时候,parent.ts还处在未加载完的状态。

我们可以去 官网看一下node中是如何处理循环引用的 。

通过官网我们可以知道,对于这样的循环引用,在child_2.ts加载parent.ts的时候,会去缓存中寻找,而由于parent.ts还未加载完成,所以缓存中会是一个空对象了,官网中用的语句是 an unfinished copy of the a.js 。

解决方案

知道原因之后,解决方案也就变得清晰了起来,一句话搞定,将parent.ts中的import语句放在后面:

export abstract class Parent {

  abstract hello(): string;

  func(): string {
    return Util.useChildInSameCase();
  }
}

import {Util} from "./util";

这样在加载parent.ts的时候,就会先export对象,然后再import所需要的util.ts了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

NodeJs 相关文章推荐
nodejs入门详解(多篇文章结合)
Mar 07 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
详解Nodejs的timers模块
Dec 22 NodeJs
Nodejs实现短信验证码功能
Feb 09 NodeJs
angular2+nodejs实现图片上传功能
Mar 27 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 NodeJs
nodejs文件夹深层复制功能
Sep 03 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 #NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
Jul 18 #NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 #NodeJs
nodejs中各种加密算法的实现详解
Jul 11 #NodeJs
监控Nodejs的性能实例代码
Jul 02 #NodeJs
搭建一个nodejs脚手架的方法步骤
Jun 28 #NodeJs
独立部署小程序基于nodejs的服务器过程详解
Jun 24 #NodeJs
You might like
如何写php程序?
2006/12/08 PHP
php记录日志的实现代码
2011/08/08 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
javascript结合fileReader 实现上传图片
2015/01/30 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
2015/05/14 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
详解AngularJS 模块化
2017/06/14 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
vue中的.$mount('#app')手动挂载操作
2020/09/02 Javascript
django使用图片延时加载引起后台404错误
2017/04/18 Python
python cx_Oracle的基础使用方法(连接和增删改查)
2017/11/19 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
python遍历一个目录,输出所有的文件名的实例
2018/04/23 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
通过python连接Linux命令行代码实例
2020/02/18 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
2020/04/29 Python
python的链表基础知识点
2020/09/13 Python
python 如何引入协程和原理分析
2020/11/30 Python
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
高二学生评语大全
2014/04/25 职场文书
难忘的一天教学反思
2014/04/30 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书
2015年幼儿园元旦亲子活动方案
2014/12/09 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
机关保密工作承诺书
2015/05/04 职场文书
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server