关于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实现发出蜂鸣声音(系统报警声)的方法
Jan 18 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
NodeJs的fs读写删除移动监听
Apr 28 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 NodeJs
Nodejs实现用户注册功能
Apr 14 NodeJs
nodejs中实现用户注册路由功能
May 20 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
NodeJS实现一个聊天室功能
Nov 25 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利用header函数实现文件下载时直接提示保存
2009/11/12 PHP
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
Apache服务器无法使用的解决方法
2013/05/08 PHP
php页面防重复提交方法总结
2013/11/25 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
四个PHP非常实用的功能
2015/09/29 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
PHPstorm激活码2020年5月13日亲测有效
2020/09/17 PHP
jQuery插件开发基础简单介绍
2013/01/07 Javascript
JS修改css样式style浅谈
2013/05/06 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
JS中如何轻松遍历对象属性的方式总结
2019/08/06 Javascript
python求解水仙花数的方法
2015/05/11 Python
Python中random模块生成随机数详解
2016/03/10 Python
在python中实现将一张图片剪切成四份的方法
2018/12/05 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
浅谈Python协程
2020/06/17 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
2014年应届大学生自我评价
2014/01/09 职场文书
建筑安全员岗位职责
2014/03/13 职场文书
村党支部书记承诺书
2014/05/29 职场文书
暑期学习心得体会
2014/09/02 职场文书
解除施工合同协议书
2014/10/17 职场文书
邀请函格式范文
2015/02/02 职场文书
音乐教师求职信范文
2015/03/20 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
Python基础之tkinter图形化界面学习
2021/04/29 Python
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
使用python绘制分组对比柱状图
2022/04/21 Python