簡體   English   中英

相互遞歸的AMD模塊

[英]Mutually recursive AMD modules

我正在嘗試使用Javascript和jQuery編寫一個相當矮胖的客戶端Web應用程序。 為了組織代碼,我閱讀了Javascript模塊系統,並決定使用AMD模塊。 目前,我正在使用curl.js作為模塊加載器,但是我對此並不特別感興趣。

不幸的是,我現在遇到了一個問題,即我的兩個模塊需要相互依賴。 我原以為它可以正常工作---但實際上發生的是,加載應用程序似乎只是在中途停止,一切都停止了,沒有錯誤消息。

快速的Google幾乎沒有提及AMD和相互遞歸模塊。 我可以實際執行此操作嗎? (是否需要更改為其他模塊加載器?)

如果不是,對支持相互遞歸模塊的替代模塊系統有何建議?

因此,在意識到“相互遞歸”的替代名稱是“循環依賴”之后,我在網上找到了一些參考(特別是該主題的require.js手冊頁 )。

簡短的摘要是:不,這不起作用。 有多種方法可以解決該問題,但從根本上講,它並不可行。

最簡單的解決方法是使用顯式的同步require()調用來打破依賴關系鏈:

define(
    ["require", "NotLoadedYet"],
    function (require, NLY)
    {
        // NLY is undefined here
        return {
            doSomething: function()
            {
                var realNLY = require("NotLoadedYet"); // fetch the real NLY on demand
                realNLY.doSomething(); // actuall call the method
            }
         };
    }
);

顯然,這僅在您可以保證在調用該方法時NotLoadedYet確實已加載的情況下才有效。

使用在已經進行動態后期綁定語言動態后期綁定的想法很EW,但它確實工作。 嘆。 似乎有一種稍微少一些的技術,它涉及改為使用requirejs的CommonJS支持,但是我不知道它是如何工作的,因此我堅持這一點。

我實際上要做的是實現一個包含實現的NotLoadedYetImpl模塊和一個通過上述機制代理的NotLoadedYet模塊。 真可惜Javascript不會在對象的所有屬性上執行getter和setter方法,或者我也可以自動執行所有操作...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM