关于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环境的方法
May 13 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
NodeJS模块与ES6模块系统语法及注意点详解
Jan 04 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
nodejs实现用户登录路由功能
May 22 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 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 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
js实现登录拖拽窗口
2020/02/10 Javascript
JS如何定义用字符串拼接的变量
2020/07/11 Javascript
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python常见格式化字符串方法小结【百分号与format方法】
2016/09/18 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
python返回数组的索引实例
2019/11/28 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
python3.9.1环境安装的方法(图文)
2021/02/02 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
船餐厅和泰晤士河餐饮游轮:Bateaux London
2018/03/19 全球购物
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
特色冷饮店创业计划书
2014/01/28 职场文书
车队司机自我鉴定
2014/03/02 职场文书
《莫泊桑拜师》教学反思
2014/04/23 职场文书
道德模范事迹材料
2014/12/20 职场文书
保送生自荐信
2015/03/06 职场文书
纪检监察立案决定书
2015/06/24 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL