Я создаю приложение интернет-магазина, состоящее из нескольких модулей. Первый модуль - это модуль данных, который предоставляет данные для остальной части приложения, а также несколько полезных методов. Вот главная суть модуля:Зависимость от данных в модуле
app.data = (function (pubsubService) {
//This is where the data is fetched
var items = app.UTILS.getAJAX('data.json', JSON.parse, false);
/* Items methods */
var getItems = function() {
return items;
};
var getItemsLength = function() {
return items.length;
};
function updateItemStock(item, amount) {
item.stock -= Number(amount);
}
return {
getItems: getItems,
getItemsLength: getItemsLength;
};
})(app.pubsub);
Элементы, вар вызывается через Ajax, с помощью следующей вспомогательной функции:
function getAJAX(url, callback, async) {
async = async || true;
var xhr = new XMLHttpRequest();
xhr.open('get', url, async);
xhr.onload = function() {
callback(this.responseText);
};
xhr.send();
}
Я попытался сделать этот вызов с асинхронным на и выключение, и независимо от того, результатом является ошибка, потому что позже по линии есть еще один модуль, который нуждается в некоторой информации о данных, но данные загружаются только LATER, вызывая ошибку. Возникает вопрос: как я могу принудительно загружать данные, которые должны быть загружены в элементы, прежде чем перейти к инициализации следующего модуля?
*** EDIT **** Это пример другого модуля, который зависит от данных:
app.mainView = (function (data, pubsubService) {
var items = [];
var generateItems = function (firstItemIndex, stopIndex) {
var dataLength = data.length;
stopIndex = (stopIndex < dataLength) ? stopIndex : dataLength;
items = data.slice(firstItemIndex, stopIndex);
pubsubService.publish('itemsGenerated');
};
var getItems = function() {
return items;
};
return {
generateItems: generateItems,
getItems: getItems
};
})(app.data.getItems(), app.pubsub);
ли этот модуль действительно нужно определить внутри обратного вызова AJAX для этой работы ? Я не являюсь поклонником этого решения
Я думал об этом, что подводит меня к следующему вопросу. В настоящее время все мои модули сразу вызываются (IIFE), поэтому, чтобы принять то, что вы предлагаете здесь, я должен на самом деле вызвать их только после завершения вызова (в качестве обратных вызовов). Чтобы сделать это, сохраняя мой код чистым, я хотел бы определить их вне области AJAX и просто ссылаться на него внутри, что потребует от меня сделать мои модули NOT IIFE. Что ты думаешь по этому поводу? Всюду, где я смотрел шаблон модуля, IIFE был предложен как способ пойти. Я не хочу слишком усложнять свой код и хочу простейшее решение. – tome
. Я имею в виду кросс-модульную зависимость здесь (все остальные модули зависят от разрешаемых данных). – tome
Если я понял ваше объяснение, см. Мой отредактированный ответ, может помочь. – chandil03