关于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 24 NodeJs
NodeJS实现客户端js加密
Jan 09 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
Nodejs实现WebSocket代码实例
May 19 NodeJs
NodeJS开发人员常见五个错误理解
Oct 14 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
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
使用PHP编写发红包程序
2015/07/22 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
PHP里的$_GET数组介绍
2019/03/22 PHP
jquery cookie的用法总结
2013/11/18 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
百度地图api如何使用
2015/08/03 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
微信小程序组件 contact-button(客服会话按钮)详解及实例代码
2017/01/10 Javascript
使用store来优化React组件的方法
2017/10/23 Javascript
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
2018/02/04 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
Python3.x对JSON的一些操作示例
2017/09/01 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
django实现支付宝支付实例讲解
2019/10/17 Python
python实现大学人员管理系统
2019/10/25 Python
乐天旅游香港网站:日本饭店预订
2017/11/29 全球购物
心理咨询承诺书
2014/05/20 职场文书
理财学专业自荐书
2014/06/28 职场文书
争先创优心得体会
2014/09/12 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
谢师宴学生答谢词
2015/09/30 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
《静夜思》教学反思
2016/02/17 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技