关于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服务器(10):处理POST请求
Dec 18 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
Nodejs 发送Post请求功能(发短信验证码例子)
Feb 09 NodeJs
NodeJS创建最简单的HTTP服务器
May 15 NodeJs
浅析 NodeJs 的几种文件路径
Jun 07 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 NodeJs
Nodejs文件上传、监听上传进度的代码
Mar 27 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
ThinkPHP之import方法实例详解
2014/06/20 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
PHP实现动态添加XML中数据的方法
2018/03/30 PHP
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
使用CamanJS在Web页面上处理图像的技巧
2015/08/18 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
微信JS接口大全
2016/08/25 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
2017/07/13 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
简单理解Vue中的nextTick方法
2018/01/30 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
2018/12/19 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
vue实现登录页面的验证码以及验证过程解析(面向新手)
2019/08/02 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
python处理中文编码和判断编码示例
2014/02/26 Python
python的中异常处理机制
2018/08/30 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
2019/06/18 Python
python要安装在哪个盘
2020/06/15 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
python 基于opencv去除图片阴影
2021/01/26 Python
巴西网上药房:onofre
2016/11/21 全球购物
国际花店:Pickup Flowers
2020/04/10 全球购物
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
物流管理毕业生自荐信
2013/10/24 职场文书
关于毕业的广播稿
2014/01/10 职场文书
办理生育手续介绍信
2014/01/14 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
实习护士自荐信
2015/03/25 职场文书
商务信函英语问候语
2015/11/10 职场文书