使用3.1.3.GA Titanium SDK,合金和2.3.3 Android模拟器。我试图使用 Ti.Network.createHTTPClient()发布一个Ajax,并且在某些时候我需要中止它,现在我正在尝试这个代码并且它没有得到工作或者ajax请求没有中止。我的代码,
INDEX.XML
<Alloy>
<Window backgroundColor="white">
<Label onClick="sendAjax">Send</Label>
<Label onClick="cancelAjax">Cancel</Label>
</Window>
</Alloy>
index.js
function sendAjax(){
var xhr = Ti.Network.createHTTPClient();
xhr.onerror = function(e){
var error = e.error;
alert(error);
};
xhr.open('GET', url);
xhr.send(params);
xhr.onload= function(e){
if (this.readyState == 4) {
alert('success');
}
else if (cancelSend) {
xhr.abort();
}
};
xhr.ondatastream = function(e){
if(ajaxCancel){
xhr.abort();
}
};
}
function cancelAjax(){
ajaxCancel = true;
}
是否可以中止ajax请求,否则必须在任何地方更改代码。任何人都使用appcelerator成功中止了ajax请求?
答案 0 :(得分:1)
直到现在还没有解决方案:使用HttpClient对象中止ajax请求。
我一直在尝试代码找出解决方案,但我放弃了。在中止请求并停止在代码中发送以下请求时检测不是一个大问题,但HttpClient对象不会停止执行已发送的请求。
如果您可以等待直到下一个版本:
有人填写了有关此问题TIMOB-15612的问题,并且已经解决了,也许解决了你的问题。
如果你不能:
经过一些谷歌搜索后,我看到this post,他们指出解决方案来了 使用TCP sockets,他们建议查看一些代码here
如果你想要的是来检测你何时中止请求并停止发送以下请求:
根据HTTPClient sdk 3.x documentation onload属性:
必须在调用open之前设置。
ondatastream和onreadystatechange属性也是如此。
你的index.js代码应该重新组织,我建议你这样:
Ti.Network.HTTPClient.UNSENT = 0;
Ti.Network.HTTPClient.OPENED = 1;
Ti.Network.HTTPClient.HEADERS_RECEIVED = 2;
Ti.Network.HTTPClient.LOADING = 3;
Ti.Network.HTTPClient.DONE = 4;
var ajaxCancel = false;
var xhr = createHTTPClient();
var url = ""; //MUST BE SET BEFORE USE
var params = ""; //MUST BE SET BEFORE USE
function createHTTPClient(){
var xhr = Ti.Network.createHTTPClient();
xhr.onerror = function(e){
Ti.API.info("-----------------------");
var error = e.error;
Ti.API.info("onerror:" + error);
};
xhr.onreadystatechange= function(e){
Ti.API.info("-----------------------");
Ti.API.info("[onreadystatechange]readyState:" + xhr.readyState);
};
xhr.onload= function(e){
Ti.API.info("-----------------------");
Ti.API.info("[onload]");
if (!ajaxCancel && this.readyState === Ti.Network.HTTPClient.DONE) {
Ti.API.info("[onload]success:");// + JSON.stringify(e));
}else{
Ti.API.info("[onload]readyState:" + xhr.readyState);
if(ajaxCancel){
Ti.API.info("[onload]abortCall:");// + JSON.stringify(e));
}else{
Ti.API.info("[onload]:");// + JSON.stringify(e));
}
}
};
xhr.ondatastream = function(e){
Ti.API.info("-----------------------");
if(ajaxCancel){
Ti.API.info("[ondatastream]abortCall:");// + JSON.stringify(e));
}else{
Ti.API.info("[ondatastream]:");// + JSON.stringify(e));
}
};
return xhr;
}
function sendAjax(){
if(ajaxCancel)
return;
Ti.API.info("----------CALL---------");
//xhr.open('GET', url);
xhr.open('POST', url);
Ti.API.info("Ti.Network.HTTPClient.UNSENT:" + Ti.Network.HTTPClient.UNSENT);
Ti.API.info("Ti.Network.HTTPClient.OPENED:" + Ti.Network.HTTPClient.OPENED);
Ti.API.info("Ti.Network.HTTPClient.HEADERS_RECEIVED:" + Ti.Network.HTTPClient.HEADERS_RECEIVED);
Ti.API.info("Ti.Network.HTTPClient.LOADING:" + Ti.Network.HTTPClient.LOADING);
Ti.API.info("Ti.Network.HTTPClient.DONE:" + Ti.Network.HTTPClient.DONE);
Ti.API.info("[sendAjax]before request");
xhr.send(params); //params not needed for a GET operation
Ti.API.info("[sendAjax]request send");
}
function cancelAjax(){
if(!xhr || ajaxCancel)
return;
Ti.API.info("-----------------------");
Ti.API.info("[cancelAjax]abort petition");
xhr.abort();
Ti.API.info("[cancelAjax]abort call executed");
ajaxCancel = true;
if(xhr.readyState === Ti.Network.HTTPClient.UNSENT ||
xhr.readyState === Ti.Network.HTTPClient.DONE){
//maybe it wasn't already sent or the cycle is completed
Ti.API.info("[cancelAjax]request not send or already done: " + xhr.readyState);
}else{
Ti.API.info("[cancelAjax]xhr.readyState:" + xhr.readyState);
}
}
function allowAjaxCalls(){
ajaxCancel = false;
}
在index.xml中添加另一个标签/按钮来控制是否允许在取消请求后发送请求:
<Alloy>
<Window backgroundColor="white">
<Button onClick="sendAjax">Send</Button>
<Button onClick="cancelAjax">Cancel</Button>
<Button onClick="allowAjaxCalls">AllowSend</Button>
</Window>
</Alloy>