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

Тема в разделе "Другие языки", создана пользователем Albert22, 12 июл 2009.

Статус темы:
Закрыта.
Модераторы: Цукер
  1. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    Как сделать чтобы 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а? Стоит раскапывать?
     
  2. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    попробуй вариант:

    Код:
    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;
      }
    }
     
  3. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    Хм, я вроде пробовал варианты заранее все переменные определять...
    Сейчас ещё раз попробую.
    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?
     
  4. cahxah7E

    cahxah7E Создатель

    Регистр.:
    3 фев 2009
    Сообщения:
    12
    Симпатии:
    1
    Раскапывать 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"}
    
     
  5. Albert22

    Albert22

    Регистр.:
    30 мар 2008
    Сообщения:
    270
    Симпатии:
    10
    Но значение не возвращается, вместо него — undefined
    PHP:
    function jsonRequest(url) {
        var 
    http_request = new Request.JSON({
            
    method'get'
            
    urlurl
            
    onComplete: function (jobjjstr) {return(jstr);}
        }).
    send()
    }

    function 
    someFunction(params) {
    json jsonRequest('/info/json/');
    alert(json); // ошибка "json undefined"
    ...
    }
     
Статус темы:
Закрыта.