Возвратить значение из асинхронного запроса

Доброе время суток!

Хотелось бы реализовать следующее поведение:

  1. Есть функция в которой идет XMLHttpRequest
  2. Полученный responseText хочется вернуть из функции при помощи return
  3. Использовать только JS без jQuery

Долго искал информацию… promises, deferreds… совсем уже запутался :(

Прошу помощи)
Спасибо :wink:

Это как раз делается с помощью промисов. Без библиотек они не поддерживаются в старых браузерах

// Кроссбраузерное получение объекта 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?

Только если делать запрос синхронным. Что крайне не рекомендуемо.

Только тем-же способом: сделать запрос синхронным.

Синхронный запрос означает, что пока сервер не ответит, вся страница зависнет, никакие анимации не будут работать, никакой джаваскрипт не будет выполняться. Так что не рекомендуется.

1 лайк

Да, спасибо
Я так тоже думал, что это максимум, который можно выжать из данной ситуации

То есть в итоге можно выкрутиться несколькими способами:

  1. Цепочка функций
  2. Огромное дерево кода “одно в другом”: как ты показывал на примере node.js

Верно?

Верно