6

我有一些数据的 ajax 调用(使用 jQuery)。在用户单击“提交”(并且已发送 ajax 调用)后,我将显示“请稍候...”消息,该消息会禁用所有内容,直到请求返回(因此用户不会双击或单击其他内容和混乱事情了)。

当出现任何类型的错误时,它的效果很好 - “请稍候......”消失了,我正在向用户显示出了什么问题。

但是如果服务器因为通信错误而没有返回任何东西会发生什么?

我找到的解决方案是为“请稍候..”消息设置 10 秒的超时时间,然后它会消失并显示“通信失败”的错误。我假设如果服务器在 10 秒后没有响应,那么它根本不会响应 - 但这是错误的假设。

问题是- 我如何确定 20 秒后服务器不会返回一些东西?可能发生的场景是用户点击提交 --> 10 秒后他收到错误消息 --> 5 秒后服务器响应并混淆用户

如何确保在隐藏“请稍候..”消息后,服务器不会弹出任何内容?

4

3 回答 3

4

你可以处理这样的事情

if ( request.readyState == 4 ){  // 4 is "complete" 
  if ( request.status == 200 ){
    // HTTP OK, carry out your normal Ajax processing
    // ... 
  }else{
    // something went wrong, report the error
    error( "HTTP "+request.status+".  An error was »
             encountered: "+ request.statusText );
  }
}

(或者)

$.ajax({
    type: "post", 
    url: "somepage.html",
    success: function (data, text) {
        //...
    },
    error: function (request, status, error) {
        alert(request.responseText);
    }
});
于 2012-05-01T08:00:15.500 回答
3

当您向服务器发送请求时。除非服务器响应,否则打开连接并保持打开状态。
1.如果由于服务器端的某些错误无法响应,则通常会发回 5xx 的响应代码(503)
2.如果由于某些连接问题,连接过早终止,那么 jquery 也会将其视为错误。

1.因此,如果您想等待服务器发送请求或连接终止(之前发生过),那么您可以completed使用jquery ajax.
2.如果您处于服务器即使在 20 秒后也没有响应的情况,并且您认为它现在应该已经响应,请使用超时。
3.最后,如果您的问题是您使用的是某种定制的(手工制作的 http 服务器),即使遇到错误也不会结束请求,那么至少对其进行足够的定制,以便它发回一些响应代码(因为这个是请求和响应的 HTTP 模型)

于 2012-05-01T09:39:46.873 回答
1
  • 触发请求时生成唯一令牌,
  • 保留有效令牌列表,
  • 当请求超时/失败时删除令牌,
  • 在执行成功/错误回调之前检查令牌是否仍然有效。

当您需要发送频繁的重复请求(例如自动完成/结果过滤)并且只有最新的处理程序应该触发时,可以调整相同的模式。

于 2012-05-01T09:31:04.823 回答