Доброе время суток!
Хотелось бы реализовать следующее поведение:
Есть функция в которой идет XMLHttpRequest
Полученный responseText
хочется вернуть из функции при помощи return
Использовать только JS без jQuery
Долго искал информацию… promises, deferreds… совсем уже запутался :(
Прошу помощи)
Спасибо :wink:
dmitry
27.Апрель.2015 06:09:35
2
Это как раз делается с помощью промисов . Без библиотек они не поддерживаются в старых браузерах
// Кроссбраузерное получение объекта Promise
function getXmlHttp() {
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
// Ajax, возвращающий знечение из тела функции
function ajax(url) {
return new Promise(function(resolve, reject) {
var xmlHTTP = getXmlHttp();
xmlHTTP.open('get', url);
xmlHTTP.onreadystatechange = function() {
if(xmlHTTP.readyState === 4) {
resolve(xmlHTTP.responseText);
}
};
xmlHTTP.send(null);
});
}
// Пример использования API
ajax('/').then(function (response) {
console.warn(response);
});
1 лайк
Спасибо, так пробовал, но не совсем то поведение, которое хочу увидеть.
Хочется сделать вот так:
function get(item) {
return ajax('/').then(function(response) {
return response;
});
}
console.log(get('apple')); //....
Но получаем это:
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
Реально ли возвратить из этой функции данные таким образом?
Можно сделать такое при помощи jQuery?
dmitry
28.Апрель.2015 08:17:59
4
Только если делать запрос синхронным. Что крайне не рекомендуемо.
Только тем-же способом: сделать запрос синхронным.
Синхронный запрос означает, что пока сервер не ответит, вся страница зависнет, никакие анимации не будут работать, никакой джаваскрипт не будет выполняться. Так что не рекомендуется.
1 лайк
Да, спасибо
Я так тоже думал, что это максимум, который можно выжать из данной ситуации
То есть в итоге можно выкрутиться несколькими способами:
Цепочка функций
Огромное дерево кода “одно в другом”: как ты показывал на примере node.js
Верно?