我正在使用Titanium SDK开发一个小型Android应用程序,该应用程序与远程PHP文件交互以检索其数据。 FOR循环在HTTPClient返回任何数据之前执行,因此'myTest'为空,并且没有任何内容添加到'tblListing'。
function jsonPOST( inAction, inParams ) { // jsonPOST is a global function
var xhr = Ti.Network.createHTTPClient({
onload : function(e) {
Ti.API.info("Received text: " + this.responseText);
return this.responseText;
},
onerror : function(e) {
Ti.API.debug(e.error);
alert('error');
return false;
},
timeout : 8000, // in milliseconds
});
var sendData = {
'action' : inAction,
'json' : JSON.stringify(inParams)
};
xhr.open('POST', "http://domain.com/file.php"); // url redacted
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send( sendData );
} // end. jsonPOST()
var myTest = jsonPOST('getlisting'); // only need to pass first param in this instance
for (i in myTest) {
tblListing.appendRow({ title: myTest[i].title, id: myTest[i].id });
}
如果不延迟在同一个线程上执行任何其他操作,我怎样才能使FOR循环等待直到HTTPClient返回数据? 'jsonPOST'函数用于检索应用程序中多个元素的各种数据,并且应保持动态。
答案 0 :(得分:2)
我最终使用回调参数来允许在HTTPClient接收数据后调用函数。这允许jsonPOST函数保持动态。
function jsonPOST(inAction, inParams, inCallback) {
var xhr = Ti.Network.createHTTPClient({
onload : function(e) {
Ti.API.info("Received text: " + this.responseText);
var reply = JSON.parse(this.responseText);
inCallback(reply);
},
onerror : function(e) {
Ti.API.debug(e.error);
alert('error');
return false;
},
timeout : 8000, // in milliseconds
});
var sendData = {
'action' : inAction,
'json' : JSON.stringify(inParams)
};
xhr.open('POST', "http://domain.com/file.php"); // url redacted
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(sendData);
}
function processListing(inJson) {
for (i in inJson) {
tblListing.appendRow({
title : inJson[i].listingTitle,
id : inJson[i].listingID
});
}
}
jsonPOST('getListing', null, processListing);
答案 1 :(得分:0)
循环必须位于绑定到xhr对象的onload
属性的函数中:
function jsonPOST( inAction, inParams ) { // jsonPOST is a global function
var xhr = Ti.Network.createHTTPClient({
onload : function(e) {
Ti.API.info("Received text: " + this.responseText);
for (i in this.responseText) {
tblListing.appendRow({ title: myTest[i].title, id: myTest[i].id });
}
return this.responseText;
},
onerror : function(e) {
Ti.API.debug(e.error);
alert('error');
return false;
},
timeout : 8000, // in milliseconds
});
var sendData = {
'action' : inAction,
'json' : JSON.stringify(inParams)
};
xhr.open('POST', "http://domain.com/file.php"); // url redacted
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send( sendData );
} // end. jsonPOST()
var myTest = jsonPOST('getlisting'); // only need to pass first param in this instance
请注意,HTTPClient的工作是异步的。它发送请求并等待数据,但同时调用脚本继续执行。