до сих пор нет решения для: отменить запрос ajax с использованием объекта HttpClient.
Я пробовал код, чтобы найти решение, но я сдался. Не является большой проблемой для обнаружения, когда вы прервали запрос и прекратили отправку следующих запросов в коде, но объект HttpClient не прекратит выполнять запросы, которые уже отправлены.
Если вы не можете ждать до следующих выпусков:
Кто заполнил вопрос по этой проблеме TIMOB-15612 и уже решена, возможно, решает ваш тоже.
Если вы не можете:
Через некоторое Googling я увидел this post, где они указывают на то, что решение приходит с использованием TCP sockets, и они предлагают глядя код here
Если то, что вы требуется для обнаружения, когда вы прервали запрос и прекратили отправку следующих запросов:
Согласно HTTPClient sdk 3.x documentation свойство перегрузки:
Должен быть установлен перед открытием.
То же самое происходит с свойствами 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>