adrenalinik
@adrenalinik
Верстальщик

Как получить результат работы ф-ии?

Подскажите пожалуйста как получить результат работы ф-ии вот сюда submitRequest('POST', gameUrls.newGame)

function submitRequest(metod, url, value, header) {
        var p = new XMLHttpRequest();
        p.open(metod, url);
        p.send();
        p.addEventListener('readystatechange', function() {
            if (p.readyState === p.DONE) {
                return JSON.parse(p.responseText)
            }
        });
}
  • Вопрос задан
  • 210 просмотров
Решения вопроса 1
twobomb
@twobomb
Асинхронная функция поэтому можно сделать дополнительный аргумент который будет содержать callback функцию. Пример.
function submitRequest(callback,metod, url, value, header) {
        var p = new XMLHttpRequest();
        p.open(metod, url);
        p.send();
        p.addEventListener('readystatechange', function() {
            if (p.readyState === p.DONE) {
                callback(JSON.parse(p.responseText));
            }
        });
}

submitRequest(function(response){//Тут можно добавить свои действия , например присвоить значение какой - либо переменной
  window.myVar  = response;
    alert(myVar);
},'POST', gameUrls.newGame)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Для решения таких задач предназначен Promise.
Это могло бы выглядеть так:

new Promise(send).then(
	function (data) {
		// И вот тут получаем данные
	},
	function () {
		// Провал
	}
);

function send (metod, url, value, header) {
	var p = new XMLHttpRequest(),
		body = null;

	if (metod && metod.toLoweCase() == 'post') {
		body = value;
		p.setRequestHeader('Content-Type', header || 'application/x-www-form-urlencoded');
	}

	p.open(metod, url);
	p.send(body);
	p.addEventListener('readystatechange', function() {
		if (this.readyState === this.DONE && this.status >=200 && this.status < 400) {
			resolve(JSON.parse(this.responseText));
		} else {
			reject();
		}
	});
}

Увы, поддержка пока отсутствует в IE (только в Edge).
По этой причине до сих пор придётся для решения в нативном Javascript передавать callback, как уже сказал twobomb, или использовать jQuery#Deferred().

send();

function send (metod, url, value, header) {
	$.ajax({
		url: url,
		type: metod,
		data: value,
		dataType: 'json'
	}).done(function (data) {
		// И вот тут получаем данные
	}).error(function () {
		// Провал
	});
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы