Android浏览器超时Ajax请求

时间:2014-01-16 16:54:10

标签: android ajax

我通过ajax(使用JQuery)提交表单,收到响应所需的时间可以是几秒钟到几分钟。这是预期的,不能改变。这在所有浏览器中工作正常,除了在120秒后超时我的请求的股票Android浏览器,无论我在ajax构造函数中设置超时。有办法解决这个问题吗?

Ajax请求的代码非常简单:

var jqxhr = $.ajax({
    type: 'post',
    timeout: 500000,
    url: 'process.php',
    data: $('form').serialize(),
    success: function (data) {
    alert("success" + data);    
    },
    error: function(xhr, error){
    alert("Error: " + error + ", XHR status: " + xhr.status);
    },
   });

在Android上使用超过120秒的脚本提交时,将使用以下消息命中错误处理程序:

Error: error, XHR status: 0

5 个答案:

答案 0 :(得分:2)

请查看此article,表明错误可能是由于存在HTTP Expires标头而引起的。

使用Fiddler之类的工具来监控HTTP网络流量并显示结果以供进一步分析。

您遇到语法错误。

var jqxhr = $.ajax({
    type: 'post',
    timeout: 500000,
    url: 'process.php',
    data: $('form').serialize(),
    success: function (data) {
    alert("success" + data");   <------- HERE   
    },
    error: function(xhr, error){
    alert("Error: " + error + ", XHR status: " + xhr.status);
    },
   });

使用此在线JavaScript runner尝试使用您的代码,但请删除额外的双重qoute。

var jqxhr = $.ajax({
    type: 'post',
    timeout: 500000,
    url: 'process.php',
    data: $('form').serialize(),
    success: function (data) {
    alert("success" + data);
    },
    error: function(xhr, error){
    alert("Error: " + error + ", XHR status: " + xhr.status);
    },
   });

答案 1 :(得分:0)

经过一些研究后,似乎其他人在〜60ms和~120ms时遇到类似的AJAX超时问题。这些似乎是非常谨慎的价值观(如内部浏览器设置),我将继续并假设缺乏响应/解决方案,我们无法绕过这些超时。

您是否考虑将您的AJAX请求发布到不执行任何处理的单独服务器/服务,并且可以返回快速200 OK响应。然后让第二个服务器处理与慢速服务器的通信。我知道这很糟糕,但它可能是你唯一的解决方案(可能会导致应用程序越来越快,用户越来越开心)。

您能否更深入地了解您的应用?这是一个PhoneGap应用程序,还是您可以从浏览器访问的某个域托管的应用程序?你能提供一个URL吗?

答案 2 :(得分:0)

您是否见过以下帖子。

AJAX (XmlHttpRequest) timeout length by browser

此致

SP

答案 3 :(得分:0)

尝试在单独的空白html页面上插入您的代码,除了您的ajax请求,附加jquery和一些基本警报,如成功,状态代码或错误等。将正确的文件路径放在url处理程序中,在数据处理程序中,放一些静态值,如name:"Macros",site:"stackoverflow"。当一切准备就绪后,您应该在桌面浏览器上收到警报消息,如果成功,请尝试在库存android浏览器上运行该html页面。如果这也有效..问题可能是jquery与其他脚本或$("form#testform").serialize()函数冲突。

答案 4 :(得分:-1)

超时后重试怎么样?

$("form#testform").submit(function(){ 

    var allFormValues = $("form#testform").serialize(); 

    $.ajax({
        cache:false,
        timeout:8000,  // I chose 8 secs for kicks
        tryCount : 0,
        retryLimit : 5,
        type:"POST",
        url:"someurl.php",
        data:allFormValues,

        error:function(xhr, status, error) { 
            if (status == 'timeout') {
                this.tryCount++;
                if (this.tryCount <= this.retryLimit) {
                    alert("Timeout! Retrying now!");
                    //try again
                    $.ajax(this);
                    return;
                }            
                return;
            } else {
                // not a timeout? not a problem
                alert("Error: " + status + ", XHR status: " + xhr.status);
            }
        },
        success:function(response){
            alert(response);
        }
    });
});
相关问题