如果没有收到正确的响应,则运行ajax一段固定的时间

时间:2013-05-03 06:14:50

标签: jquery ajax

function submitForm(){
    var urlid = document.getElementById("actionUrl").value;
    jQuery.support.cors = true;

    setTimeout(function(){
      $.ajax({
        url:urlid,
        type : "GET",
        crossDomain : true,
        data:transId,
        success:function(data)
        {
            alert(data);
        },

        error: function (xhr, ajaxOptions, thrownError)
        {
            console.log(thrownError);
            alert(xhr.status);
            alert(ajaxOptions);
            alert(thrownError);
        }
        });
    },1000);
};

我有一个ajax调用,从控制器接收三个响应中的一个'true','false'或'pending'。如果响应为“true”或“false”,则ajax应终止。如果响应是“待定”,则ajax应该再次向控制器轮询20秒。我应该能够将响应传递给不同的javascript函数。是否可以在ajax / jquery中执行此操作?我是这项技术的新手。

6 个答案:

答案 0 :(得分:1)

基本上延伸Michael的回答

function checkData (data) {
  if (data == 'true')         // do something
  else if (data == 'false')   // do something else
  else if (data == 'pending') {
    if ( !pollServer.stopPoll ) {
      ajaxPoll = setTimeout(pollServer, 1000);
    } else {
      // polled long enough
    }
  }
}

function pollServer() {
  $.ajax({
    url:         pollServer.urlid,
    type:        "GET",
    crossDomain: true,
    data:        transId,
    success:     checkData
    error:       // error function
  });
}

function submitForm(){
  var urlid = document.getElementById("actionUrl").value;
  jQuery.support.cors = true;
  pollServer.urlid = urlid;
  pollServer.stopPoll = false;
  ajaxPoll = setTimeout(pollServer, 1000);
  setTimeout(function() {
    pollServer.stopPoll = true;
  }, 20000);
}

答案 1 :(得分:0)

var ajaxtimeout = setTimeout(function(){...}

setTimeout(function() { clearTimeout(ajaxtimeout); }, 20000);

哦,你也必须在你的请求对象上调用.abort(),但是我懒得重写你的代码:)

答案 2 :(得分:0)

这样的事情应该这样做:

function checkData (data) {
  if (data == 'true')         // do something
  else if (data == 'false')   // do something else
  else if (data == 'pending') {
    setTimeout(pollServer, 20000);
  }
}

function pollServer() {
   var urlid = document.getElementById("actionUrl").value;
   $.ajax({
    url:         urlid,
    type:        "GET",
    crossDomain: true,
    data:        transId,
    success:     checkData
    error:       // error function
  });
}

function submitForm(){
   jQuery.support.cors = true;
   pollServer();
}

答案 3 :(得分:0)

有一个内置的jQuery ajax超时属性,请使用:http://api.jquery.com/jQuery.ajax/

timeout
Type: Number
Set a timeout (in milliseconds) for the request.

示例:Determine if $.ajax error is a timeout

答案 4 :(得分:0)

    function aftersuccess(data)
    {
        if(data=="success"){
            document.getElementById("demo2").innerHTML = data;
            }
        else if(data=="false"){
            document.getElementById("demo2").innerHTML = data; }
        else{
            setTimeout(submitForm,1000);
            document.getElementById("demo2").innerHTML = data;
            }
    }

    var xhr;
    var i = 0;
    var transId; 
    function submitForm(){
        jQuery.support.cors = true;
        var urlid = document.getElementById("actionUrl").value;
        transId = document.getElementById("transId").value;
        transId = 'transId='+transId;

        xhr = $.ajax({
        url:urlid,
        type : "GET",
        crossDomain : true,
        data:transId,
        success:function(data)
        {
            i = i+1;
            aftersuccess(data);
        },
        error: function (xhr, ajaxOptions, thrownError)
        {
            console.log(arguments);
            console.log(xhr.status);
            console.log(ajaxOptions);
            console.log(thrownError);
            alert(xhr.status);
            alert(ajaxOptions);
            alert(thrownError);
        }
        });

        if(i>20){
            xhr.abort();
            alert("Failed :  "+transId)
            window.location.href = "random url";
        }

};

初始化变量i。每次调用ajax时它都会递增。达到特定值后,我中止ajax调用并重定向url。

答案 5 :(得分:0)

setTimeOut()方法用于在指定的时间后调用JS函数。据我所知,这里的要求是只要响应消息为“pending”就保持连接处于活动状态

如果来自服务器的响应消息“待定”,上面建议的代码将发送新的Ajax请求。

我会建议另一种服务器端解决方案,这对我来说过去很有用。如果操作成功或失败,您只会发回响应,并为该控制器配置请求超时(例如,20秒)。

希望这会有所帮助。