Как добраться до возвращаемого объекта в jquery? - PullRequest
0 голосов
/ 06 августа 2011

У меня проблемы с получением объекта, возвращаемого одним методом.Для простоты, например:

var param = { }; // global variable
var url = 'some url which executes query';

function openURL(url) {

    var http_request = new XMLHttpRequest();
    http_request.onreadystatechange = handle_json;
     // Gets data in JSON format
    http_request.open("GET", url);
    http_request.send(null);


 function handle_json() {
        if (http_request.readyState == 4) {
                if (http_request.status == 200) {
                        var json_data = http_request.responseText; // gets text response
                        var obj = jQuery.parseJSON(json_data);
                                                param = { lastID: obj.data };
                        if(obj.returnCodeDescription == null) {
                            //alert("Data updated!");
                        } else {
                            //alert("Error!");
                        }
                } else {
                        alert('There was some problems! Sorry!');
                }
                http_request = null;
        }
 }

 return param;

}

Теперь, в каком-то другом методе, скажем, QueryResult (), я бы хотел получить переменные, которые содержит param объекта.

function QueryResult {

var query = 'some query here';
var result = openURL(url+query);

alert( ??? ); **// here I would like to display the value of param.lastID**

}

У меня действительно нет никаких идей, как заставить это работать.Может ли кто-нибудь дать мне подсказку, которая поможет мне получить возвращенный объект из метода openURL в QueryResult?

Ответы [ 2 ]

1 голос
/ 06 августа 2011

Вы пытаетесь использовать асинхронную функцию, как если бы она была синхронной.

openURL() возвращает значение до вызова handle_json().

Это можно исправить, сделав openURL () асинхронной функцией. Поэтому функция, в которой вы используете openURL, будет выглядеть так:

function QueryResult() {
  var query = 'some query here';
  var result = openURL(url+query, function(param) {
    alert( ??? ); **// here I would like to display the value of param.lastID**
  });
}

... и openURL () будет выглядеть так:

function openURL(url, callback) {

    var http_request = new XMLHttpRequest();
    http_request.onreadystatechange = handle_json;
     // Gets data in JSON format
    http_request.open("GET", url);
    http_request.send(null);


 function handle_json() {
        if (http_request.readyState == 4) {
                if (http_request.status == 200) {
                        var json_data = http_request.responseText; // gets text response
                        var obj = jQuery.parseJSON(json_data);

                        // *instead of returning, call callback*
                        callback({ lastID: obj.data });

                        if(obj.returnCodeDescription == null) {
                            //alert("Data updated!");
                        } else {
                            //alert("Error!");
                        }
                } else {
                        alert('There was some problems! Sorry!');
                }
                http_request = null;
        }
 }
}
0 голосов
/ 06 августа 2011

Асинхронная функция вызывается при возникновении события - то есть после вызова внешней функции.Попробуйте это:

http://jsfiddle.net/Jacek_FH/AAQqt/

function openURL(url, callback) {
    ...

    function handle_json() {
        ...

        callback(param);
    }
}


openURL(url, function(param){
    alert(param.lastID);
});
...