Ограничение относится к упрощенному синтаксису CommonJS по сравнению с обычным синтаксисом обратного вызова:
Загрузка модуля по сути является асинхронным процессом из-за неизвестного времени его загрузки. Однако RequireJS в эмуляции серверной спецификации CommonJS пытается дать вам упрощенный синтаксис. Когда вы делаете что-то вроде этого:
var foomodule = require('foo');
// do something with fooModule
То, что происходит за кулисами, заключается в том, что RequireJS смотрит на тело вашего функционального кода и анализирует, что вам нужно «foo» и загрузить его до вашей функции выполнение. Однако, когда переменная или что-то иное, чем простая строка, например ваш пример ...
var module = require(path); // Call RequireJS require
... then Require не может разобрать это и автоматически преобразовать его. Решение состоит в том, чтобы преобразовать в синтаксис обратного вызова;
var moduleName = 'foo';
require([moduleName], function(fooModule){
// do something with fooModule
})
Учитывая вышеизложенное, рассмотрим один из возможных вариантов повторного использования вашего второго примера для использования стандартного синтаксиса:
define(['dyn_modules'], function (dynModules) {
require(dynModules, function(){
// use arguments since you don't know how many modules you're getting in the callback
for (var i = 0; i < arguments.length; i++){
var mymodule = arguments[i];
// do something with mymodule...
}
});
});
EDIT : Из вашего собственного ответа, я вижу, вы используете underscore / lodash, поэтому использование _.values
и _.object
может упростить цикл с использованием массива аргументов, как указано выше.