Как я могу вернуть переменную из правильной области JS? - PullRequest
0 голосов
/ 27 августа 2009

Я занимаюсь разработкой с использованием JS и Adobe AIR. Я хочу создать запрос к удаленному веб-сайту (например, для аутентификации).

Проблема не связана с AIR, это вещь JS, которую я не могу понять правильно. То, что я хочу сделать, это получить тело запроса, но если я просто верну "str" ​​var, он покажет "undefined". Я пытался объявить это «глобально» внутри функции, но это не сработало. Я предполагаю, что есть некоторая проблема объема, которую я пропускаю.

        function doRequest(url){
            var req = new XMLHttpRequest();

            req.onreadystatechange = function(){
                if (req.readyState == 4) {
                    var str = req.responseText;
                    runtime.trace("deRequest result: " + str);

                        return str;
                }
            };
            req.open('GET', url, true);
            req.send(null);
        }

Ответы [ 2 ]

2 голосов
/ 27 августа 2009

Вы не должны пытаться получить возвращаемое значение функции onreadystatechange. XHR является асинхронным, что означает, что этот код запускается только при выполнении запроса. Таким образом, вы должны быть готовы сделать что-то с вашим ответом внутри этой функции. Самое простое, что нужно сделать - передать функцию обратного вызова.

    function doRequest(url, callback_func){
        var req = new XMLHttpRequest();

        req.onreadystatechange = function(){
            if (req.readyState == 4) {
                var str = req.responseText;
                runtime.trace("deRequest result: " + str);

                callback_func(str);
            }
        };
        req.open('GET', url, true);
        req.send(null);
    }

    function callback_func(data) {
        // do something with your response data
    }
1 голос
/ 27 августа 2009

Вы возвращаете его вызывающей стороне onreadystatechange, которая вряд ли заинтересует. Вы также не можете вернуть его в конце doRequest, потому что он вернется сразу после вызова req.send(null), а значение еще не доступно (все еще необходимо получить с сервера). Через некоторое время вызывается ваш обработчик onreadystatechange, и вы получаете значение. На данный момент никуда не нужно возвращать его.

Вам необходимо структурировать свой код так, чтобы вместо return str вы делали все, что хотите, с возвращаемым значением - например, сохраните его где-нибудь, отобразите, используя alert, передайте его другой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...