Возвращение результата из 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);
}
|
Нельзя вернуть результат с помощью return из AJAX запроса. JavaScript - асинхронный язык. Использовать полученную информацию можно только с помощью callback.
|
Посоветуйте как решить проблему?
|
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;
}
|
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);
}
|
вот так всеравно 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;}));
|
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;}));
|
Deff
анонимная функция в параметре выполняется независемо от того что там написано в vote, ваш вариант сначала выдает андефаинд как результат выполненияя анонимной функции, затем вылетает алерт с result как раз с тем значением которое я никак не могу вернуть из vote. |
ozzon91,
alert(vote(url, function(result){return result;}));
Не могу понять почему вы так делаете Я ж расписал - vote ничего не возвращает, но в нее вы передаете callback, который выполнится только после того как придет ответ с сервера |
кака вычявить 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. Остается только догадываться либо постоянно проверять, что как-то само по себе бредово
Цитата:
|
<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>
|
Myfunc просто выдаст алерт, я же не смогу написать
function fn(result) {
return result;
}
зачем мне этот алерт |
ozzon91,
вы куда его возвращать пытаетесь? Обрабатывайте уже. |
поробуйте использовать готовые библиотеки для работы с аяксом
их навалом сейчас есть и YUI (Yahoo-шная) и jQuery в обеих случаях нужно подключить в свой документ всего пару файлов зато на сколько упрощается вся остальная процедура кодинга можно возвращать данные (которые вернул сервер) в XML или просто в текстовом формате использовать методы GET или POST, просто указав, как именно вы отправляете данные запроса |
Цитата:
Вместо alert - ставите Ваш код работающий с этими данными |
Цитата:
function MyFunc(result) {
Тут Ваше все ранее задуманное
}
|
| Часовой пояс GMT +3, время: 03:39. |