关于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制作爬虫全过程
Dec 22 NodeJs
使用nodejs开发cli项目实例
Jun 03 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
Nodejs进阶:express+session实现简易登录身份认证
Apr 24 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
nodeJS实现路由功能实例代码
Jun 08 NodeJs
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
Sep 29 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
Nov 30 NodeJs
Nodejs实现图片上传、压缩预览、定时删除功能
Oct 25 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 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
实时抓取YAHOO股票报价的代码
2006/10/09 PHP
深入array multisort排序原理的详解
2013/06/18 PHP
Yii2中如何使用modal弹窗(基本使用)
2016/05/30 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
九种原生js动画效果
2015/11/11 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
Vue递归实现树形菜单方法实例
2018/11/06 Javascript
JS中的一些常用的函数式编程术语
2019/06/15 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
理解python正则表达式
2016/01/15 Python
python利用标准库如何获取本地IP示例详解
2017/11/01 Python
python 同时运行多个程序的实例
2019/01/07 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
2020/04/09 Python
爱游人:Travelliker
2017/09/05 全球购物
英国灯具和灯泡网上商店:Lights.co.uk
2018/02/02 全球购物
保险专业大专生求职信
2013/10/26 职场文书
英语专业应届生求职信范文
2013/11/15 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
金融专业毕业生自荐信
2014/06/26 职场文书
长城导游词400字
2015/01/30 职场文书
python 爬取天气网卫星图片
2021/06/07 Python
本地搭建minio文件服务器(使用bat脚本启动)的方法
2022/07/15 Servers