【发布时间】:2015-04-07 21:12:12
【问题描述】:
我有一个简单的 ajax 请求来加载更多帖子。我正在考虑在调用一个“加载更多”ajax 请求时使用锁,以防止多次调用“加载更多”。计划是在调用ajax请求方法时锁定它,并在它返回时通过request.done或request.fail方法释放锁定。 是否存在 jQuery ajax 请求没有调用其中任何一种方法的情况(例如短暂的 Internet 连接中断)?
【问题讨论】:
我有一个简单的 ajax 请求来加载更多帖子。我正在考虑在调用一个“加载更多”ajax 请求时使用锁,以防止多次调用“加载更多”。计划是在调用ajax请求方法时锁定它,并在它返回时通过request.done或request.fail方法释放锁定。 是否存在 jQuery ajax 请求没有调用其中任何一种方法的情况(例如短暂的 Internet 连接中断)?
【问题讨论】:
在所有包装器之下,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 为它提供了一个默认的非空值(我自己没有检查过,答案可能已经过时了,你必须参考的最新来源)。一些浏览器具有内置的超时默认值,但它们因供应商而异。
因此,如果您不手动配置超时,可能请求会无限期挂起,尽管不太可能。因此,明智的做法是实施故障保护超时。
【讨论】: