国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

關于NodeJS中的循環引用詳解

2019-11-19 11:09:14
字體:
來源:轉載
供稿:網友

最近在用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了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辛集市| 视频| 荆门市| 壶关县| 乌兰县| 田东县| 太仓市| 安溪县| 巍山| 隆安县| 社会| 平阴县| 左云县| 上栗县| 安宁市| 海口市| 汽车| 石渠县| 彭山县| 沙坪坝区| 曲阜市| 富民县| 绥中县| 镇坪县| 塔城市| 临清市| 扶余县| 康马县| 西丰县| 靖安县| 通州区| 龙泉市| 太康县| 利辛县| 怀安县| 调兵山市| 高唐县| 视频| 酉阳| 贵港市| 拉萨市|