Возврат данных, разрешенных XMLHttpRequest, с функцией шаблона модуля

У меня проблема с объединением обратных вызовов javascript и раскрытием шаблона модуля. Я пытаюсь вернуть текст ответа HTTP с помощью метода функции carsData.getCars().

В основном, что я хочу сделать, это:

  1. вернуть данные из функции xhr.onreadystatechange в приватную функцию getData
  2. вернуть данные из функции getData в общедоступную функцию getCars (или вызвать функцию getCars, возвращающую значение)

Я заставил его работать с синхронным режимом AJAX, но я знаю, что это не лучшая практика в разработке javascript.

Я пытался заставить его работать с обратными вызовами, но с треском провалился. Это вообще возможно сделать в javascript?

P.S. Я использую XMLHttpRequest в Vanilla JS вместо других фреймворков для обучения.

'use strict';
var carsData = (function() {
    var carsElement = document.getElementById('carsListing'),
        successHandler = function(data) {
            carsElement.innerHTML = data.data;
            //return data;
        },
        dataWrapper = "",
        getData = function(callback) {
            var url = 'data/cars.json',
                xhr = new XMLHttpRequest();    

            xhr.onreadystatechange = function() {
                var status;
                var data;

                if (xhr.readyState == 4) { // `DONE`
                    status = xhr.status;
                    if (status == 200) {
                        data = JSON.parse(xhr.responseText);
                        successHandler && successHandler(data);
                        callback(data);
                        return data;
                    }
                }
            };
            xhr.open('get', url, false); // synchronous js
            xhr.send();
            return xhr.onreadystatechange();
            //return 'xx';
        }

    return {
        getCars: function() {
            return getData(function(data){
              console.log(data); // Object {data: Array[5]}
            })
        }

    }
})();

person Silvers    schedule 03.06.2016    source источник
comment
Вам следует взглянуть на обещания. Они еще не поддерживаются во всех браузерах, но их можно использовать в нескольких фреймворках (с соответствующей реализацией). Вы можете вернуть промис в своем модульном шаблоне и решить его позже.   -  person ssc-hrep3    schedule 03.06.2016
comment
Спасибо @ssc-hrep3, я обязательно изучу это и попытаюсь обдумать это :)   -  person Silvers    schedule 03.06.2016


Ответы (1)


Нет. Вы не можете сделать это таким образом. Я понял, почему вы обычно видите результаты, отправленные в объект DOM. Потому что они там ждут ответа. Ваш оператор return, каким бы нелогичным он ни казался (при условии, что вы исходите из непрототипных языков), уже будет выполнен. Кажется, что это не так, но это так из-за асинхронной природы, о которой вы знаете. Вы должны использовать промисы или ваш обратный вызов должен что-то делать с данными, которые «ожидают» данных обратного вызова, как вы сделали с successdata.

person johnny    schedule 29.03.2017