我有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);
}
答案 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();
};
此时此代码仍然可以清理很多,但我尽量保持简单,因此更容易看出哪里有重大变化。