2015-03-13 4 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; если это зависит, вы можете добавить это как пояснение. –

ответ

0

Я бы вернул promise в ваш exports.

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

Смежные вопросы