Есть такой код:
var artAjaxRequest = new function ()
{
var xhr;
xhr = new XMLHttpRequest();
xhr.open('GET', '/assets/json/arts.json', true);
xhr.send();
xhr.onload = function(){
// Тут мы парсим json и формируем массив картинок
}
this.getNewArts = function(){
// Эта функция занимается тем, что выводит картинки на страницу
};
}();
Исполняется это всё "хозяйство" через artAjaxRequest.getNewArts();.
Но есть тут проблема: когда я пишу где-то в коде artAjaxRequest.getNewArts();, выполняется код getNewArts, тогда как сам json ещё не "прилетел" и функция onload не отработала своё. Почему? Потому что ajax-запрос не выполняется так быстро, как с кодом разбирается браузер.
Соответственно, json не распарсен и в функции getNewArts возникают ошибки.
И вот вопрос: как сделать так, чтобы .getNewArts выполнялась после того, как отработает xhr.onload?
Но не спешите помещать artAjaxRequest.getNewArts(); внутрь onload. Загвозка в том, что метод getNewArts() будет вызываться часто, а не один единственный раз, когда прилетает json.
Буду благодарен за разъяснения и советоы по улучшению композиции кода.
не спешите помещать artAjaxRequest.getNewArts(); внутрь onloadНепонятно, почему нет. – vp_arth Mar 01 '17 at 21:19onload? Это обработчик. Он срабатывает 1 раз, когда запрос завершается (успешно или нет). Это будет нелогично - парсить json 20 раз. Насчет другого я пояснил в вопросе. – wokalek Mar 01 '17 at 21:22getNewArts()в обработчикonload, потому что представь, чтоartAjaxRequest.getNewArts();много раз присутствует в коде при разных условиях. JSON не успеет придти, а кодgetNewArts()будет выполняться (вернее - не будет, ведь будут ошибки, так как json, которого ещё нет, нужно ещё распарсить). – wokalek Mar 01 '17 at 21:24