即使服务器没有响应,jQuery中的“ajax”调用也会激活“成功”功能

时间:2010-10-19 14:51:26

标签: jquery ajax

看起来jQuery的.ajax函数会激活'success'函数,即使它没有得到服务器的响应。我认为这是一个错误。我通过检查是否'request.status===0'来检测此事件,是否有其他任何实例,即使出现错误情况,我应该检查'success'函数将被触发的位置?

我已经发布了我现在正在使用的代码。这种情况通常如何处理?

$.ajax({ 
    async : true, cache : false, dataType : 'json',
    type : 'POST',
    url : 'person/' + personKey,
    data : JSON.stringify({firstName:'Jilopi',}),

    success : function(data, textStatus, request){
        if( request.status === 0 ){
            alert('Error: problem saving person - no response');
        }else{
            alert('Success: saved person');
        }
    },
    error : function(request, textStatus, errorThrown){
        alert('Error: problem saving person');
    },
});

2 个答案:

答案 0 :(得分:8)

你已经确定了我所知道的唯一“错误成功”问题。稍微详细说明一下:这是一个严格适用于Opera的解决方法(它将实际上一个304作为0返回),你可以看到评论在 1.4.2 (以及之前的版本)中:http://github.com/jquery/jquery/blob/1.4.2/src/ajax.js#L551

但是,it has been removed in jQuery 1.4.3 because of your exact issue,您可以看到the change that did it here

简短回答:升级到jQuery 1.4.3+以解决您的问题,您可以取消status === 0支票。

答案 1 :(得分:0)

我还需要显示ES服务器是否在线! 我的解决方案:

  

我使用长轮询来检查我的服务器状态!而ES已经有了   REST API调用只是为了获取有关ES服务器的信息!

     

该群集健康请求!

Read about ES Cluster Health Requests here!

只需在Web浏览器中键入以下内容,然后查看有关ES服务器的响应!

http://your-server-url:9200/_cluster/health

简单的jQuery长轮询递归函数代码:

(function poll(){
health_url = "http://your-server-url:9200/_cluster/health";
online_ajax = false;
setTimeout(function(){
    $.ajax({
     url: health_url,
     dataType: "json",
     success: function(data){
            if (data.status == 'yellow') {
                // Show Server-Online Status Message in your App
            } else {
                // Show Server-Offline Status Message in your App
            };
            //Setup the next poll recursively
            poll();
          }
      })
      .fail(function(){
            // Show Server-Offline Status Message in your App
      });
}, online_status_time_out);
})();

希望这个答案对每个人都有帮助!

干杯!!!