关于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中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
详解nodeJS之二进制buffer对象
Jun 03 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
nodejs 如何手动实现服务器
Aug 20 NodeJs
NodeJS服务器实现gzip压缩的示例代码
Oct 12 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 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获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
PHP微信红包生成代码分享
2016/10/06 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
JS面向对象、prototype、call()、apply()
2009/05/14 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
javascript中加号(+)操作符的一些神奇作用
2014/06/06 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
JavaScript获取Url里的参数
2014/12/18 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
微信小程序左右滑动的实现代码
2017/12/15 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
JS定义函数的几种常用方法小结
2019/05/23 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
新手入门Python编程的8个实用建议
2019/07/12 Python
python实现布隆过滤器及原理解析
2019/12/08 Python
pandas 对group进行聚合的例子
2019/12/27 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
Python headers请求头如何实现快速添加
2020/11/03 Python
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
护理学毕业生求职信
2013/11/14 职场文书
中学生家长评语大全
2014/04/16 职场文书
市级文明单位申报材料
2014/05/07 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
小学安全汇报材料
2014/08/14 职场文书
大学生村官个人对照检查材料(群众路线)
2014/09/26 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
单位考核鉴定意见
2015/06/05 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
Python 数据科学 Matplotlib图库详解
2021/07/07 Python