關(guān)于NodeJS中的循環(huán)引用詳解
最近在用node的時候排查一個問題排查了半天,最終發(fā)現(xiàn)是循環(huán)引用導(dǎo)致的問題,故在此記錄一下。
場景復(fù)現(xiàn)
出現(xiàn)問題場景比較簡單,一共四個類:
- 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"; } }
這個時候我們?nèi)?gòu)造一個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這個文件里已經(jīng)import了parent,為什么會是undefined呢?后來debug查了一下代碼的堆棧,恍然大悟:
入口文件->child.ts->parent.ts->util.ts->child_2.ts->parent.ts
很明顯這里存在著一個循環(huán)引用,當(dāng)我們在加載child_2.ts這個文件的時候,parent.ts還處在未加載完的狀態(tài)。
我們可以去 官網(wǎng)看一下node中是如何處理循環(huán)引用的 。
通過官網(wǎng)我們可以知道,對于這樣的循環(huán)引用,在child_2.ts加載parent.ts的時候,會去緩存中尋找,而由于parent.ts還未加載完成,所以緩存中會是一個空對象了,官網(wǎng)中用的語句是 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了。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
node鏈接mongodb數(shù)據(jù)庫的方法詳解【阿里云服務(wù)器環(huán)境ubuntu】
這篇文章主要介紹了node鏈接mongodb數(shù)據(jù)庫的方法,結(jié)合實例形式分析了nodejs基于阿里云服務(wù)器環(huán)境ubuntu下實現(xiàn)連接MongoDB數(shù)據(jù)庫的相關(guān)操作技巧,需要的朋友可以參考下2019-03-03淺談NodeJs之?dāng)?shù)據(jù)庫異常處理
這篇文章主要介紹了淺談NodeJs之?dāng)?shù)據(jù)庫異常處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10Nodejs訪問網(wǎng)絡(luò)并解析返回的json的實現(xiàn)方法
本文主要介紹了Nodejs訪問網(wǎng)絡(luò)并解析返回的json的實現(xiàn)方法,文中根據(jù)實例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03詳解Node.js利用node-git-server快速搭建git服務(wù)器
本篇文章主要介紹了詳解Node.js利用node-git-server快速搭建git服務(wù)器,非常具有實用價值,需要的朋友可以參考下2017-09-09node.js調(diào)用腳本(python/shell)和系統(tǒng)命令
這篇文章介紹了node.js調(diào)用腳本(python/shell)和系統(tǒng)命令的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07node.js中使用q.js實現(xiàn)api的promise化
這篇文章主要介紹了node.js中使用q.js實現(xiàn)api的promise化,promise一個標(biāo)準(zhǔn),它描述了異步調(diào)用的返回結(jié)果,包括正確返回結(jié)果和錯誤處理,需要的朋友可以參考下2014-09-09