关于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 win7下安装方法
May 24 NodeJs
Windows系统中安装nodejs图文教程
Feb 28 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
Nodejs如何复制文件
Mar 09 NodeJs
ajax +NodeJS 实现图片上传实例
Jun 06 NodeJs
NodeJS收发GET和POST请求的示例代码
Aug 25 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
NVM安装nodejs的方法实用步骤
Jan 16 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 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/10/09 PHP
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php购物网站支付paypal使用方法
2010/11/28 PHP
php获取mysql字段名称和其它信息的例子
2014/04/14 PHP
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
PHP include任意文件或URL介绍
2014/04/29 PHP
简单的php新闻发布系统教程
2014/05/09 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP如何通过表单直接提交大文件详解
2019/01/08 PHP
Discuz! 6.1_jQuery兼容问题
2008/09/23 Javascript
js中onload与onunload的使用示例
2013/08/25 Javascript
javascript抽象工厂模式详细说明
2014/12/16 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
老生常谈Python序列化和反序列化
2017/06/28 Python
python网络编程 使用UDP、TCP协议收发信息详解
2019/08/29 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
Python sublime安装及配置过程详解
2020/06/29 Python
有针对性的求职自荐信
2013/11/14 职场文书
营销专业应届生求职信
2013/11/26 职场文书
军训考核自我鉴定
2014/02/13 职场文书
抽奖活动主持词
2014/03/31 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
交通事故协议书范文
2014/10/23 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
病危通知书样本
2015/04/17 职场文书
二审代理词范文
2015/05/25 职场文书
学校少先队工作总结
2015/08/12 职场文书
企业团队精神心得体会
2016/01/19 职场文书
利用Python网络爬虫爬取各大音乐评论的代码
2021/04/13 Python
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers