Titanium 我可以在一个函数中使用来自两个不同HttpClient的数据吗

Titanium 我可以在一个函数中使用来自两个不同HttpClient的数据吗,titanium,titanium-mobile,Titanium,Titanium Mobile,我有两个阵列由两个不同的HttpClient填充。我希望能够在函数中从这两个数组中提取数据。我尝试使用回调函数,它对其中一个非常有效,但是当我尝试添加另一个httpclient并添加另一个回调函数时,它将不起作用。我甚至可以像这样使用多个回调吗?这是我的密码: var myGeocodeArray = []; var myUserArray = []; function retrieveData(myCallback, myCallBack2) { // Load geocode da

我有两个阵列由两个不同的HttpClient填充。我希望能够在函数中从这两个数组中提取数据。我尝试使用回调函数,它对其中一个非常有效,但是当我尝试添加另一个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);
}

默认情况下,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);
有关更多信息,请查看

更新:代码的问题在于函数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();
};

从这一点上讲,这段代码仍然可以进行大量清理,但我尽量使其保持简单,以便更容易看到有重大更改的地方。

这不允许我的第二次回调工作。它给了我一个错误:“undefined”不是计算“myCallBack2(myUserData)”的函数。我知道数据是好的,因为当我分别运行它们时,它们都返回了数据;当我试图将它们组合在一起时,错误就出现了。如果您定义了myCallBack2函数,它将不会运行多个creatHTTPClientCheck。记住它是区分大小写的名称。我怀疑您创建了myCallback2()函数并拼错了它;这就是你指的吗?好吧,现在我看到你的错误了。检查我的最新答案。