我可以在一个函数中使用来自2个不同httpclients的数据吗?

时间:2013-11-22 22:44:46

标签: titanium titanium-mobile

我有2个阵列由2个不同的HTTPClients填充。我希望能够在我的函数中从这两个数组中提取数据。我尝试使用回调,它适用于一个,但当我尝试添加其他httpclient并添加另一个回调时,它将无法正常工作。我甚至可以使用这样的多个回调吗?这是我的代码:

var myGeocodeArray = [];
var myUserArray = [];

function retrieveData(myCallback, myCallBack2) {
    // Load geocode data
    xhr = Titanium.Network.createHTTPClient();
    xhr.open('GET', 'http://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=MyAdress');

    xhr.onload = function() {
        var myData = JSON.parse(this.responseText);
        myCallback(myData);
    };
    xhr.send();

    // Load user data
    loader = Titanium.Network.createHTTPClient();
    loader.open("GET", "http://example.com/getGroups.php");

    loader.onload = function() {
        var myUserData = JSON.parse(this.responseText);
        myCallBack2(myUserData);
    };
    loader.send();
};


retrieveData(function(returnVar, returnVar2) {
    myGeocodeArray = returnVar;
    myUserArray = returnVar2;
    populateMap();
});


function populateMap() {
    Ti.API.info(myGeocodeArray);
    Ti.API.info(myUserArray);
}

1 个答案:

答案 0 :(得分:0)

默认情况下,HTTPClient是异步工作的,因此您的代码应该可以正常工作。您可以通过简单的回调记录请求状态的变化:

xhr.onreadystatechange = function(event) {
  console.log(this.readyState); // values from 0 to 4
  // For more descriptive readyState, small snippet using underscore.js:
  // Strings: UNSENT, HEADERS_RECIEVED, LOADING, DONE
  console.log( _.keys(this)[_.values(this).lastIndexOf(this.readyState)] );
}

如果要同步进行http调用,则必须在open()方法中将第三个参数设置为false:

loader.open("GET", "http://example.com/getGroups.php", false);

有关详细信息,请查看Appcelerator documentation about HTTPClient object

UPDATE:代码的问题在于函数retrieveData(),它接受两个参数:myCallback和myCallBack2但是当你调用这个函数时,你只需传递一个参数:

retrieveData(function(returnVar, returnVar2) {
    myGeocodeArray = returnVar;
    myUserArray = returnVar2;
    populateMap();
});

为了更具可读性,请检查此重构代码:

var myCallback = function(returnVar, returnVar2) {
    myGeocodeArray = returnVar;
    myUserArray = returnVar2;
    populateMap();
}

retrieveData(myCallback);

因此myCallBack2未定义并导致错误。

您可以通过从代码中删除myCallBack2来修复,只需使用一个参数进行回调函数:

function retrieveData(myCallback) {
    // Load geocode data
    xhr = Titanium.Network.createHTTPClient();
    xhr.open('GET', 'http://maps.googleapis.com/maps/api/geocode/json?sensor=true&address=MyAdress');

    xhr.onload = function() {
        var myData = JSON.parse(this.responseText);
        myCallback(myData);  
    };
    xhr.send();

    // Load user data
    loader = Titanium.Network.createHTTPClient();
    loader.open("GET", "http://example.com/getGroups.php");

    loader.onload = function() {
        var myUserData = JSON.parse(this.responseText);
        myCallback(myUserData);
    };
    loader.send();
};

此时此代码仍然可以清理很多,但我尽量保持简单,因此更容易看出哪里有重大变化。