ixon
@ixon


Почему при попытке возвращение ответа json в функцию, возвращается undefined? Как это исправить?

Вот этот код по идее должен возвращать ответ с запроса localhost/ajax.json?get=1, однако возвращает undefined:
function testj(e){
		var returnData="";
		$.ajax({
			url:"http://localhost/ajax.json?get="+e,
			dataType: 'jsonp',
			success:function(json){
				returnData = json;
				console.log(json);//работает
			}
		});
		return returnData;//не возвращает json объект
	}
console.log(testj("1"));
  • Вопрос задан
  • 1072 просмотра
Решения вопроса 2
w999d
@w999d
Web-developer
Потому что success выполняется позже return
A в AJAX - асинхронный

> исправить
выполнить код в success, например
Ответ написан
Petroveg
@Petroveg
Миром правят маленькие с#@&ки
Для организации работы с асинхронным кодом (XMLHttpRequest или setTimeout) нужно использовать функции, возвращающие объекты promise, поскольку функция завершит свою работу в потоке раньше, чем будет выполнен асинхронный вызов.
В jQuery для этого реализован Deferred Object. Причём в методе ajax() он реализован по умолчанию.

Вот примерно так с проверкой на наличие объекта:

testj('1').then(function (json) {
	console.log(json);
});

function testj (e) {
	var d = $.Deferred(),
		x = ...; //Проверяем, вдруг объект уже получен и сохранён

	if (x) { //Объект уже есть
		d.resolve(x);
	} else { //Объект нужно загрузить
		$.ajax({
			url: 'http://localhost/ajax.json?get=' + e,
			dataType: 'json'
		}).done(function (data) {
			... //Например, сохраняем
			d.resolve(data);
		});
	}

	return d.promise();
}

И откройте тайну — зачем вам jsonp? Вы не используете callback.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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