关于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中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
Windows系统中安装nodejs图文教程
Feb 28 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
Highcharts+NodeJS搭建数据可视化平台示例
Jan 01 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
nodejs+express搭建多人聊天室步骤
Feb 12 NodeJs
nodejs中方法和模块用法示例
Dec 24 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 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中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
php curl_init函数用法
2014/01/31 PHP
浅谈php优化需要注意的地方
2014/11/27 PHP
CodeIgniter集成smarty的方法详解
2016/05/26 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
iframe 异步加载技术及性能分析
2011/07/19 Javascript
js showModalDialog弹出窗口实例详解
2014/01/07 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
实现JavaScript高性能的数据存储
2016/12/11 Javascript
jquery validation验证表单插件
2017/01/07 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
js实现数字滚动特效
2019/12/16 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
Python实现简单的文本相似度分析操作详解
2018/06/16 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
作为网站管理者应当如何防范XSS
2014/08/16 面试题
高级护理专业毕业生推荐信
2013/12/25 职场文书
阿德的梦教学反思
2014/02/06 职场文书
民生工作实施方案
2014/05/31 职场文书
公司年底活动方案
2014/08/17 职场文书
办理收楼委托书范本
2014/10/09 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
签证工作证明模板
2015/06/15 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
Python加密技术之RSA加密解密的实现
2022/04/08 Python
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL