У меня проблема с объединением обратных вызовов javascript и отображением шаблона модуля. Что я пытаюсь сделать, так это вернуть текст ответа HTTP с помощью метода функции carsData.getCars()
.Возвращаемые данные, разрешенные XMLHttpRequest с функцией шаблона модуля
В основном то, что я хочу сделать, это:
- возврата данных из
xhr.onreadystatechange
функции частномуgetData
функции - возврата данных из
getData
функции в общественнойgetCars
функции (или вызовите функциюgetCars
возвращения a)
Я получил его для работы с синхронным режимом 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]}
})
}
}
})();
Вы должны взглянуть на [обещает] (http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promisifying-xmlhttprequest). Они пока не поддерживаются во всех браузерах, но они могут использоваться и использоваться в нескольких рамках (с их соответствующей реализацией). Вы можете вернуть обещание в своем модульном шаблоне и решить его позже. –
Спасибо @ ssc-hrep3, я обязательно посмотрю на него и попытаюсь обернуть вокруг себя голову :) – Silvers