2015-03-13 82 views
1

AMD是否允許您根據其他模塊定義導出爲動態的模塊?AMD模塊中的動態導出

我的問題是define立即返回,即使在正文中有require調用。這意味着,如果模塊的定義依賴於其他模塊,則取決於它的任何模塊都不能確定該模塊是否已完全加載,即使依賴性已滿足。

一些代碼來解釋我的問題:

// A module that exports one function 'f'. The implementation of this f comes 
// from another module, dynamically selected based on a condition. 
define("mymodule", function (require, exports) { 
    var functionImplModule = someCondition ? "function-impl1" : "function-impl2"; 
    require([functionImplModule], function (functionImpl) { 
    exports.f = functionImpl; 
    }); 
}); 

// Entry point. I want to use module.f in some code. 
require(["mymodule"], function (mymodule) { 
    // Can't use mymodule.f here yet, because the require() of 'mymodule' isn't done yet 
    console.log(mymodule.f); 
}); 

可以這樣AMD在做什麼?或者這樣的代碼如何更好地構造?

+0

如果我正確解釋了這個問題,那麼您使用的是[簡體CommonJS包裝糖](http://requirejs.org/docs/whyamd.html#sugar),它依賴於解析源代碼的魔法做出簡單的假設,並且與動態依賴不兼容。如果你重寫你的定義更直接的AMD方式:'define([someCondition?「function-impl1」:「function-impl2」],function(functionImpl){return {f:functionImpl};})' someCondition'不依賴於mymodule的依賴;如果它是依賴的,你可以補充說明。 – 2017-04-01 15:40:32

回答

0

我會在您的exports中返回promise

define("mymodule", function (require, exports) { 
    var deferred = ..., functionImplModule = someCondition ? "function-impl1" : "function-impl2"; 
    require([functionImplModule], function (functionImpl) { 
     deferred.resolve(functionImpl); 
     }); 

    exports.f = deferred.promise; 
}); 

// Entry point. I want to use module.f in some code. 
require(["mymodule"], function (mymodule) { 
    mymodule.f.then(function(impl) ...); 
}); 

請注意還可以看出你是懶惰模塊的配置爲好。這不利於捆綁和縮小。也許你可以使用你的配置來改變mymodule使用哪個文件。

+0

謝謝。回調/承諾是我的備份計劃,我想我希望有內置更優雅的東西,特別是因爲它是爲異步加載而構建的。 – Remko 2015-03-17 17:13:03