关于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代码片段
Feb 04 NodeJs
Nodejs如何复制文件
Mar 09 NodeJs
nodejs实现发出蜂鸣声音(系统报警声)的方法
Jan 18 NodeJs
nodejs获取微信小程序带参数二维码实现代码
Apr 12 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
NodeJS服务器实现gzip压缩的示例代码
Oct 12 NodeJs
Nodejs 识别图片类型的方法
Aug 15 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
动态生成gif格式的图像要注意?
2006/10/09 PHP
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
php创建图像具体步骤
2017/03/13 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
JS的replace方法详细介绍
2012/11/09 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
2014/04/04 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
jquery编写Tab选项卡滚动导航切换特效
2020/07/17 Javascript
浅谈Cookie的生命周期问题
2016/08/02 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
vue 优化CDN加速的方法示例
2018/09/19 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
Vue 子组件与数据传递问题及注意事项
2019/07/11 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
解决vuex数据页面刷新后初始化操作
2020/07/26 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
python实现多线程抓取知乎用户
2016/12/12 Python
Python排序搜索基本算法之归并排序实例分析
2017/12/08 Python
Python3实现转换Image图片格式
2018/06/21 Python
戴尔新西兰官网:Dell New Zealand
2020/01/07 全球购物
职业培训师职业生涯规划
2014/02/18 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
入党转正申请书范文
2019/05/20 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技