关于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+express(4.x+)实现文件上传功能
Nov 23 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
浅谈Nodejs应用主文件index.js
Aug 28 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
Nodejs--post的公式详解
Apr 29 NodeJs
NodeJS简单实现WebSocket功能示例
Feb 10 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
图解NodeJS实现登录注册功能
Sep 16 NodeJs
nodejs实现UDP组播示例方法
Nov 04 NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 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在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
2011/08/03 PHP
探讨PHP JSON中文乱码的解决方法详解
2013/06/06 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
PHP微信支付实例解析
2016/07/22 PHP
php依赖注入知识点详解
2019/09/23 PHP
JavaScript Date对象 日期获取函数
2010/12/19 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
2014年最火的Node.JS后端框架推荐
2014/10/27 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
jQuery实现点击行选中或取消CheckBox的方法
2016/08/01 Javascript
防止Node.js中错误导致进程阻塞的办法
2016/08/11 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
js + css实现标签内容切换功能(实例讲解)
2017/10/09 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
vue实现购物车的监听
2020/04/20 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
Eclipse和PyDev搭建完美Python开发环境教程(Windows篇)
2016/11/16 Python
tensorflow入门之训练简单的神经网络方法
2018/02/26 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
2019/06/21 Python
python已协程方式处理任务实现过程
2019/12/27 Python
python实现字符串和数字拼接
2020/03/02 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
VSCODE配置Markdown及Markdown基础语法详解
2021/01/19 Python
美国知名运动产品零售商:Foot Locker
2016/07/23 全球购物
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
高校十八大报告感想
2014/01/27 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
公司总经理岗位职责
2014/03/15 职场文书
房租涨价通知
2015/04/23 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android