0

Am используя 3.1.3.GA Titanium SDK, сплавы и 2.3.3 Android-эмулятор. Я пытаюсь опубликовать Ajax, используя Ti.Network.createHTTPClient(), и в какой-то момент мне нужно его прервать. Теперь я пытаюсь использовать этот код и не получать работу, или запрос ajax не прерывается. Мой код,отменить запрос http Titanium Appcelerator

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 запрос, иначе придется менять код в любом месте. Кто-нибудь получил успех в прерывании запроса ajax с помощью appcelerator?

ответ

1

до сих пор нет решения для: отменить запрос 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> 
Смежные вопросы