Как сделать чтобы функция возвращала значение?

Статус
В этой теме нельзя размещать новые ответы.

Albert22

Старатель
Регистрация
30 Мар 2008
Сообщения
270
Реакции
11
Как сделать чтобы JS функция возвращала значение?

Вот имеется функция на базе XMLHTTPRequest:
Код:
function jsonRequest(url) {
http_request = prepareRequest();
http_request.open('GET', url, [B]false[/B]);
http_request.send(null);
    if ( http_request.readyState == 4 ) {
        if ( http_request.status == 200 ) {
            var result=http_request.responseText;
       } else {
            alert("Error!");
        }
       http_request = null;
    }
return (result);
}
Но выделенный выше жирненьким параметр гласит о том, что запрос асинхронен, да и сама конструкция функции тоже всем своим видом какбы говорит нам. Поэтому браузер тупит и виснет пока не выполнит её (=не дождётся ответа от сервера). Вот её переписанный тестовый асинхронный вариант:
Код:
var jsonResult = '';
function jsonRequest(url) {
http_request = prepareRequest();
http_request.open('GET', url, true);
http_request.onreadystatechange = function() { getJsonResponse(http_request); }
http_request.send(null);
 alert(jsonResult);
//return (jsonResult);
 }

function getJsonResponse(http_request) {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
jsonResult='Response: '+http_request.responseText;
return(jsonResult);
}}
}
Но что-то нестабильно работает, возвращает пустые значения. Всё утро ломаю голову как исправить чтоб возвращалось нормальное полученное от сервера значение. С тем, кстати, всё нормально, проверено на синхронном варианте. Помогите пожалуйста, а то уже я туплю и висну... Заранее спасибо.

P.S. Полученный json я декодирую mootools'ом. Знаю, что в него встроен ещё и механизм запросов, но он какой-то уж больно рекурсивный, и я в нём ничуть не разобрался. Интересуюсь: он вообще намного лучше/эффективнее вот такого XMLHTTPRequestа? Стоит раскапывать?
 
попробуй вариант:

Код:
var jsonResult = '';
function jsonRequest(url) {
  [B][COLOR="Red"]jsonResult = '';[/COLOR][/B]
  http_request = prepareRequest();
  http_request.open('GET', url, true);
  http_request.onreadystatechange = function() { getJsonResponse(http_request); }
  http_request.send(null);
  alert(jsonResult);
//return (jsonResult);
 }


function getJsonResponse(http_request) {
  if (http_request.readyState == 4) {
    // [B][COLOR="red"]не анализируем status[/COLOR][/B]
jsonResult='Status: '+http_request.status+' Response: '+http_request.responseText;
  }
}
 
Хм, я вроде пробовал варианты заранее все переменные определять...
Сейчас ещё раз попробую.
UPD в итоге, я не знаю с какой радости, заработал вот какой вариант:
Код:
var jsonResult = '';
function jsonRequest(url) {
  http_request = prepareRequest();
  http_request.open('GET', url, true);
  http_request.onreadystatechange = function() { getJsonResponse(http_request); }
  http_request.send(null);
  alert(jsonResult);
//return (jsonResult);
 }


function getJsonResponse(http_request) {
  if (http_request.readyState == 4) {
    // анализируем status
if (http_request.status == 200) {
jsonResult='Status: '+http_request.status+' Response: '+http_request.responseText;
}
  }
}
Но опять же возникла проблема.
В моём случае функция запроса вызывается из
Код:
window.addEvent('domready', function() { ... });
При таком автозапуске возвращается пустое значение из-за var jsonResult = '';
Когда ставлю просто var jsonResult; приходит undefined.
При повторном запуске функции (вручную кликом) всё нормально.
Но мне именно надо чтобы работал первый запуск — при загрузке страницы...
Any ideas?
 
Раскапывать mootools очень даже стоит, там внутри красиво...

Средствами mootols:
Код:
<script type="text/javascript">
var jsonRequest = function (url) {
    var http_request = new Request.JSON({
        method: 'get', 
        url: url, 
        onComplete: getJsonResponse 
    }).send()
}
var getJsonResponse = function( obj ) {
    //obj - это уже есть ваш json объект
    alert( obj.text );
}
window.addEvent('domready', function() {jsonRequest( '/ajax/json.data/' );});
</script>

содержимое url('/ajax/json') //ответ от сервера:
Код:
{"text":"im here"}
 
Но значение не возвращается, вместо него — undefined
PHP:
function jsonRequest(url) {
    var http_request = new Request.JSON({
        method: 'get', 
        url: url, 
        onComplete: function (jobj, jstr) {return(jstr);}
    }).send()
}

function someFunction(params) {
json = jsonRequest('/info/json/');
alert(json); // ошибка "json undefined"
...
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху