【问题标题】:Does jQuery ajax request always call done or fail methods?jQuery ajax 请求是否总是调用完成或失败方法?
【发布时间】:2015-04-07 21:12:12
【问题描述】:

我有一个简单的 ajax 请求来加载更多帖子。我正在考虑在调用一个“加载更多”ajax 请求时使用锁,以防止多次调用“加载更多”。计划是在调用ajax请求方法时锁定它,并在它返回时通过request.done或request.fail方法释放锁定。 是否存在 jQuery ajax 请求没有调用其中任何一种方法的情况(例如短暂的 Internet 连接中断)?

【问题讨论】:

    标签: jquery ajax


    【解决方案1】:

    在所有包装器之下,jQuery 的 ajax 只是一个 XMLHttpRequest。 XMLHttpRequest 可以处于以下状态之一:

    • UNSENT(数值0):对象已构建完毕。

    • OPENED(数值1):open()方法已成功调用,可以使用send()方法发出请求。

    • HEADERS_RECEIVED(数值 2):已遵循所有重定向(如果有)并且已收到最终响应的所有 HTTP 标头。该对象的多个响应成员现在可用。

    • LOADING(数值3):正在接收响应实体正文。

    • DONE(数值 4):数据传输已完成或传输过程中出现问题(例如无限重定向)。

    本质上,您是在询问是否存在在请求为OPENED 之后从未达到DONE 的情况。

    如果有无限次重定向,我们将从HEADERS_RECEIVED 跳转到DONE(状态为失败)并且请求完成。
    如果重定向成功,我们继续LOADING,如果数据成功接收,则继续DONE

    但是,如果从未收到数据而我们一直在等待怎么办? XMLHttpRequest 有一个属性timeout,它指定了在多少毫秒后请求超时后失败。然而,根据this question,jQuery doesn't 为它提供了一个默认的非空值(我自己没有检查过,答案可能已经过时了,你必须参考的最新来源)。一些浏览器具有内置的超时默认值,但它们因供应商而异。

    因此,如果您不手动配置超时,可能请求会无限期挂起,尽管不太可能。因此,明智的做法是实施故障保护超时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-26
      • 2013-10-28
      • 1970-01-01
      • 2019-06-08
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多