Команда работает в интерактивной оболочке, но не в сценарии оболочки

Ограничение относится к упрощенному синтаксису 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 может упростить цикл с использованием массива аргументов, как указано выше.

0
задан Grant Birchmeier 17 December 2012 в 23:07
поделиться