2015-07-18 5 views
1

Я создаю приложение интернет-магазина, состоящее из нескольких модулей. Первый модуль - это модуль данных, который предоставляет данные для остальной части приложения, а также несколько полезных методов. Вот главная суть модуля:Зависимость от данных в модуле

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 для этой работы ? Я не являюсь поклонником этого решения

ответ

0

Любая операция, требующая данных, поступающих из Ajax, должна быть записана в методе обратного вызова. Поэтому всякий раз, когда доступны данные, ваш код будет вызываться.

Перезвонить вам метод, как следующие:

getAJAX(url, function(data){ 
// write any code that want data from Ajax. 
}, true); 

Альтернатива:

function doSomeThing(data) 
{ 
// do something 
} 

getAJAX(url, function(data){ 
    doSomeThing(data); 
    }, true); 

Or 

getAJAX(url,doSomeThing, true); 

Не делать вызов, имеющий Async ложь. это приведет к тому, что пользовательский интерфейс UI будет вялым.

*** EDITED ***

Я использовал свой код, чтобы упростить его.

// Modified it in a method that can be put anywhere you want 
app.methodName = 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 
    }; 
}; 

И

// call that method in a callback like this. 
app.mainView = app.methodName(app.data.getItems(), app.pubsub); 

Это, как вы можете написать одну строку кода в функции обратного вызова, чтобы получить работу, которая будет удалять сложность также.

+0

Я думал об этом, что подводит меня к следующему вопросу. В настоящее время все мои модули сразу вызываются (IIFE), поэтому, чтобы принять то, что вы предлагаете здесь, я должен на самом деле вызвать их только после завершения вызова (в качестве обратных вызовов). Чтобы сделать это, сохраняя мой код чистым, я хотел бы определить их вне области AJAX и просто ссылаться на него внутри, что потребует от меня сделать мои модули NOT IIFE. Что ты думаешь по этому поводу? Всюду, где я смотрел шаблон модуля, IIFE был предложен как способ пойти. Я не хочу слишком усложнять свой код и хочу простейшее решение. – tome

+0

. Я имею в виду кросс-модульную зависимость здесь (все остальные модули зависят от разрешаемых данных). – tome

+0

Если я понял ваше объяснение, см. Мой отредактированный ответ, может помочь. – chandil03