关于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
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
详解nodejs微信公众号开发——6.自定义菜单
Apr 13 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
nodejs实现的连接MySQL数据库功能示例
Jan 25 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
Nov 30 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
安装APACHE
2007/01/15 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
PHP中的闭包(匿名函数)浅析
2015/02/07 PHP
功能强大的php文件上传类
2016/08/29 PHP
php实现多站点共用session实现单点登录的方法详解
2019/09/18 PHP
PHP设计模式之建造者模式(Builder)原理与用法案例详解
2019/12/12 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
Javascript 篱式条件判断
2008/08/22 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
js获取鼠标位置实例详解
2015/12/09 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
2019/09/11 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
python遍历数组的方法小结
2015/04/30 Python
Python图片转换成矩阵,矩阵数据转换成图片的实例
2018/07/02 Python
浅析PEP572: 海象运算符
2019/10/15 Python
Python Selenium安装及环境配置的实现
2020/03/17 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
html5中的一些标签学习(心得)
2016/10/18 HTML / CSS
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
New Balance澳大利亚官网:运动鞋和健身服装
2019/02/23 全球购物
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
汽车促销活动方案
2014/03/31 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
2014年内勤工作总结
2014/11/24 职场文书
党校学习党性分析材料
2014/12/19 职场文书
故宫导游词
2015/01/31 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书