Возвращение результата из 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 чтобы я мог его использовать не только в коллбэке, а и во всем скрипте или же мне все логику остальную в коллбек занести
|
Часовой пояс GMT +3, время: 17:49. |