Подтвердить что ты не робот

Require.js синхронный

Я бы хотел определить модуль, который вычисляет новую зависимость, извлекает ее и возвращает результат. Например:

define(['defaults', 'get_config_name'] function(defaults, get_config_name){
    var name = get_config_name();
    var config;
    require.synchronous([configs/'+name'], function(a){
        config = defaults.extend(a);
    });
    return config;
});

Есть ли способ сделать это или лучший способ атаковать эту проблему?

4b9b3361

Ответ 1

  • Вы можете попытаться использовать синхронный вызов RequireJS require('configs/'+get_config_name()), но он будет загружать модуль синхронно, только если он уже загружен, иначе это вызовет исключение. Загрузка модуля/файла JavaScript синхронно технически невозможна. UPD: Это возможно (см. ответ Henrique), но очень не рекомендуется. Он блокирует выполнение JavaScript, что приводит к замораживанию всей страницы. Таким образом, RequireJS не поддерживает его.

  • Из вашего прецедента кажется, что вам не нужен синхронный RequireJS, вам нужно вернуть результат асинхронно. AMD шаблон позволяет определять зависимости и загружать их асинхронно, но функция модуля factory должна возвращать результат синхронно. Решением может быть использование плагинов-загрузчиков (подробнее здесь и здесь):

    // config_loader.js
    define(['defaults', 'get_config_name'], function(defaults, get_config_name) {
        return {
            load: function (resourceId, require, load) {
                var config_name = 'configs/' + get_config_name();
                require([config_name], function(config) {
                    load(defaults.extend(config));
                })
            }
        }
    });
    
    // application.js
    define(['config_loader!'], function(config) {
        // code using config
    });
    
  • Если get_config_name() содержит простую логику и не зависит от других модулей, тем лучше и проще вычисляется на лету путь настройки конфигурации, или в случае, если ваш конфиг зависит от контекста - вариант конфигурации карты.

    function get_config_name() {
        // do something
    }
    require.config({
        paths: {
            'config': 'configs/' + get_config_name()
        }
    });
    require(['application', 'defaults', 'config'], function(application, defaults, config) {
        config = defaults.extend(config);
        application.start(config);
    });
    

Ответ 2

Загрузка JavaScript синхронно НЕ технически невозможна.

function loadJS(file){  
   var js = $.ajax({ type: "GET", url: file, async: false }).responseText; //No need to append  
}

console.log('Test is loading...');
loadJS('test.js');
console.log('Test was loaded:', window.loadedModule); //loadedModule come from test.js