中止http请求Titanium Appcelerator

时间:2013-11-19 11:13:34

标签: ajax appcelerator titanium-mobile appcelerator-mobile titanium-alloy

使用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请求?

1 个答案:

答案 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>