关于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学习笔记之Http模块
Jan 13 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
nodejs实现获取某宝商品分类
May 28 NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
Nodejs调用WebService的示例代码
Sep 29 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
nodejs express配置自签名https服务器的方法
May 22 NodeJs
nodejs使用async模块同步执行的方法
Mar 02 NodeJs
nodejs中实现用户注册路由功能
May 20 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
Nodejs + Websocket 指定发送及群聊的实现
Jan 09 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生成短网址示例
2014/05/05 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
字符串的replace方法应用浅析
2011/12/06 Javascript
javascript随机显示背景图片的方法
2015/06/18 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
基于javascript实现图片懒加载
2016/01/05 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
2017/09/13 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
2020/06/24 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
详解Swift中属性的声明与作用
2016/06/30 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
python kmeans聚类简单介绍和实现代码
2018/02/23 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
python属于解释型语言么
2020/06/15 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
2020/07/13 Python
关于Assembly命名空间的三个面试题
2015/07/23 面试题
介绍一下Java中标识符的命名规则
2014/02/03 面试题
应用心理学个人求职信范文
2013/12/11 职场文书
五水共治一句话承诺
2014/05/30 职场文书
十佳党员事迹材料
2014/08/28 职场文书
一份教室追逐打闹的检讨书
2014/09/27 职场文书
认错检讨书
2014/10/02 职场文书
质量保证书格式模板
2015/02/27 职场文书
中学生自我评价范文
2015/03/03 职场文书
Python中的变量与常量
2021/11/11 Python
openstack云计算keystone组件工作介绍
2022/04/20 Servers