RequireJS/AMD и глобально доступные значения
Я использую RequireJS/AMD, чтобы разбить мое приложение JS. Один из моих модулей - это "окружающий" модуль, который делает только запрос (асинхронно) и затем сохраняет возвращенные данные. Этот модуль среды является зависимостью практически для всех остальных модулей в моем приложении.
Моя проблема в том, что мне нужна эта информация о среде, доступная немедленно. Есть ли способ, которым я могу гарантировать, что мой асинхронный запрос завершен и что мои переменные установлены правильно, прежде чем модуль среды возвращается?
environment.js
define(["./opui"], function(opui){
var environment = {
jsonpath: null,
imgpath: null,
platform: null
};
//request environment data asynchronously
getEnvironment();
//callback that sets environment data
setEnvironment();
return environment;
})
1 ответ
Необходимость беспокоиться о порядке инициализации часто означает, что дизайн имеет недостатки; это именно то, для чего существует RequireJS.
Используйте текстовый плагин† в каждом модуле, который нуждается в этом environment
данные:
define(['dep1', 'dep2', 'text!./environment'],
function (dep1, dep2, environmentJsonString) {
var environment = JSON.parse(environmentJsonString);
dep1.foo(environment.platform);
});
куда ./environment
URL-адрес вызова на стороне сервера, который возвращает данные в формате JSON, например:
{ "jsonpath": "...",
"imgpath": "...",
"platform": "..." }
Это делает получение данных во время запуска приложения зависимым, поэтому RequireJS позаботится о том, чтобы ожидать асинхронного вызова AJAX для ./environment
возвращать.
Имейте в виду, что все модули будут использовать один и тот же изменяемый экземпляр. Кроме того, не забудьте установить inlineText: false
в r.js
Конфигурация сборки, чтобы избежать вставки этой строки JSON в процессе оптимизации.
† есть плагин JSON, который обрабатывает синтаксический анализ text->JSON, но по какой-то причине он не работает для меня.