Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Возвращение результата из ajax запроса (https://javascript.ru/forum/misc/30337-vozvrashhenie-rezultata-iz-ajax-zaprosa.html)

ozzon91 01.08.2012 02:08

Возвращение результата из ajax запроса
 
Почему вылетает undefined когда return result хотя alert(result); выдает верный результат, как корректно вернуть результат?
function vote(url) {
	var req = createXmlHttpRequestObject();
	var result;
	
	req.onreadystatechange = function() {  
	if (req.readyState == 4 && req.status == 200) {
		result = req.responseText;
		return result;
		}
	}
	req.open("GET", url, true);
	req.send(null);
}

pharrell 01.08.2012 02:34

Нельзя вернуть результат с помощью return из AJAX запроса. JavaScript - асинхронный язык. Использовать полученную информацию можно только с помощью callback.

ozzon91 01.08.2012 02:46

Посоветуйте как решить проблему?

shkoder 01.08.2012 02:53

function vote(url, callback) {
	var req = createXmlHttpRequestObject();
	var result;
	req.onreadystatechange = function() {  
	if (req.readyState == 4 && req.status == 200) {
		result = req.responseText;
		if (typeof callback === 'function')
			callback.call(this, result);
		}
	}
	req.open("GET", url, true);
	req.send(null);
}
vote('url', function(response){
	alert(response);
});

Привыкайте к асинхронному программированию.
req.onreadystatechange - обработчик события (а оно происходит не сразу), т.е. представьте вот так.
function vote(url) {
	var req = createXmlHttpRequestObject();
	var result;
	//req.onreadystatechange определяем обработчик события, но для наглядности не будем брать это во внимание 
	req.open("GET", url, true);
	req.send(null);
}
console.log(vote(url)); // >>> undefined

по событию readystatechange, т.е. через некоторое время, когда с сервера придет ответ, выполнится
if (req.readyState == 4 && req.status == 200) {
	result = req.responseText;
	return result;
}

Deff 01.08.2012 02:54

ozzon91,
function vote(url) {
	var req = createXmlHttpRequestObject();
	var result;
	
	req.onreadystatechange = function() {  
	if (req.readyState == 4 && req.status == 200) {
		result = req.responseText;
		//Вот туть вставляем свою вызов функции обработки инфы; 
                        МуProcess(result) ;

		}
	}
	req.open("GET", url, true);
	req.send(null);
}

ozzon91 01.08.2012 03:20

вот так всеравно undefined
function vote(url, callback) {
	var req = createXmlHttpRequestObject();
	var result;
	
	req.onreadystatechange = function() {  
	if (req.readyState == 4 && req.status == 200) {
		result = req.responseText;
		if(typeof callback === 'function'){
			callback(result);
			}
		}
	}
	req.open("GET", url, true);
	req.send(null);
}

alert(vote(url, function(result){return result;}));

Deff 01.08.2012 03:30

ozzon91,
Что говорит подобный тест
function vote(url, callback) {
	var req = createXmlHttpRequestObject();
	var result;
	
	req.onreadystatechange = function() {  
	if (req.readyState == 4 && req.status == 200) {
		result = req.responseText;
		alert(result);
		//callback(result);
		}
	}
	req.open("GET", url, true);
	req.send(null);
}

alert(vote(url, function(result){return result;}));

ozzon91 01.08.2012 03:37

Deff
анонимная функция в параметре выполняется независемо от того что там написано в vote, ваш вариант сначала выдает андефаинд как результат выполненияя анонимной функции, затем вылетает алерт с result как раз с тем значением которое я никак не могу вернуть из vote.

shkoder 01.08.2012 03:43

ozzon91,
alert(vote(url, function(result){return result;}));

Не могу понять почему вы так делаете
Я ж расписал - vote ничего не возвращает, но в нее вы передаете callback, который выполнится только после того как придет ответ с сервера

ozzon91 01.08.2012 03:51

кака вычявить result чтобы я мог его использовать не только в коллбэке, а и во всем скрипте или же мне все логику остальную в коллбек занести

shkoder 01.08.2012 03:58

Цитата:

Сообщение от ozzon91 (Сообщение 193495)
кака вычявить result чтобы я мог его использовать не только в коллбэке, а и во всем скрипте

вот так
var result;
function vote(url) {
	var req = createXmlHttpRequestObject();
	var result;
	req.onreadystatechange = function() {  
	if (req.readyState == 4 && req.status == 200) {
		result = req.responseText;
	}
	req.open("GET", url, true);
	req.send(null);
}
vote('url');
//вот тут вам доступен result до readystatechange он равен undefined, после readystatechange - req.responseText. Остается только догадываться либо постоянно проверять, что как-то само по себе бредово

Цитата:

Сообщение от ozzon91 (Сообщение 193495)
или же мне все логику остальную в коллбек занести

логику по работе с результатом, полученным в результате запроса

Deff 01.08.2012 04:07

<script>
function LoadMy(Link,selektor){
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}
var xmlhttp=getXmlHttp();xmlhttp.open('GET',Link,true);xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState==4){if(xmlhttp.status==200){
MyFunc(xmlhttp.responseText)
}}};xmlhttp.send(null);
}
</script>

<script>
 var Link='http://forum.mybb.ru/'  //Линк
 LoadMy(Link);

  function MyFunc(result) {
  alert(result)                  //Тут Ваши Данные
}
</script>

ozzon91 01.08.2012 04:50

Myfunc просто выдаст алерт, я же не смогу написать
function fn(result) {
  return result;
 }

зачем мне этот алерт

shkoder 01.08.2012 05:10

ozzon91,
вы куда его возвращать пытаетесь? Обрабатывайте уже.

kerk 01.08.2012 05:57

поробуйте использовать готовые библиотеки для работы с аяксом
их навалом сейчас
есть и YUI (Yahoo-шная) и jQuery
в обеих случаях нужно подключить в свой документ всего пару файлов
зато на сколько упрощается вся остальная процедура кодинга
можно возвращать данные (которые вернул сервер) в XML или просто в текстовом формате
использовать методы GET или POST, просто указав, как именно вы отправляете данные запроса

Deff 01.08.2012 10:07

Цитата:

Сообщение от Deff
alert(result)                  //Тут Ваши Данны

ozzon91,
Вместо alert - ставите Ваш код работающий с этими данными

Deff 01.08.2012 10:12

Цитата:

Сообщение от ozzon91
кака вычявить result чтобы я мог его использовать не только в коллбэке, а и во всем скрипте

Никак - вы просто оборачиваете Ваши действия новой функцией
function MyFunc(result) {
  Тут Ваше все ранее задуманное
 }


Часовой пояс GMT +3, время: 19:52.