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

首頁 > 語言 > JavaScript > 正文

關于NodeJS中的循環引用詳解

2024-05-06 15:36:44
字體:
來源:轉載
供稿:網友

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 博客| 南岸区| 天全县| 卢龙县| 海伦市| 色达县| 原阳县| 尉犁县| 中阳县| 广德县| 察雅县| 读书| 北辰区| 手游| 天全县| 颍上县| 加查县| 宝清县| 正阳县| 句容市| 银川市| 揭东县| 旬邑县| 扬中市| 海林市| 綦江县| 彭水| 卢龙县| 盈江县| 巩留县| 凤山市| 吉木萨尔县| 灵武市| 平舆县| 马边| 望江县| 广元市| 揭西县| 滕州市| 玉溪市| 托克托县|