SDw*_*rfs 9 ajax xmlhttprequest limit polling rate
我刚看到有些浏览器会阻止HTTP轮询(我想通过限制请求的速率)......
来自https://github.com/sstrigler/JSJaC:
注意:由于大多数现代浏览器的安全限制阻止HTTP轮询再次可用,因此默认情况下此模块已被禁用.如果你想在使用'make polling'中编译它.
这可以解释我的一些JavaScripts的一些不当行为(有时请求不会被发送或重试,即使它们实际上是成功的).但我无法找到有关细节的更多信息..
谢谢你的帮助...
斯特凡
是的,据我所知,默认池限制为 10 个,每个请求的默认请求超时为 30 秒,但是超时和轮询限制是可以控制的,不同的浏览器实现不同的限制!
查看这个Google 实施。
这是捕获超时错误的绝佳实现!
您可以在这里找到 Firefox 的详细信息!
Internet Explorer 的具体信息由 Windows 注册表内部控制。
也看看这个问题。
基本上,您的控制方式不是通过更改浏览器限制,而是通过遵守它们。因此,您应用了一种称为节流的技术。
将其视为创建 FIFO/优先级函数队列。将 xhr 请求作为成员并在它们之间强制执行延迟的队列结构是 Xhr Poll。例如,我正在使用 Jsonp 从位于另一个域的 node.js 服务器获取数据,并且由于浏览器限制,我当然会进行轮询。否则,我从服务器得到零响应,这只是因为浏览器限制。
我实际上正在为每个应该发送的请求创建控制台日志,但并非所有请求都被记录。所以浏览器限制了它们。
我会更具体地帮助你。我的网站上有一个页面,应该呈现数十甚至数百篇文章的视图。您可以使用很酷的水平滑块浏览它们。
滑块的当前值与当前“页面”匹配。由于我每页仅显示 5 篇文章,并且无法在不严重影响性能的情况下准确“onload”加载数千篇文章,因此我加载当前页面的文章。我通过向 Python 脚本发送跨域请求从 MongoDB 获取它们。
该脚本应该返回一个由五个对象组成的数组,其中包含为“页面”构建 DOM 元素所需的所有详细信息。然而,有几个问题。
首先,滑块运行得非常快,因为它或多或少是一个值的变化。即使有拖放功能、按键事件等,实际的更改也需要几毫秒。然而,滑块的代码看起来像这样:
goog.events.listen(slider, goog.events.EventType.CHANGE, function() {
myProject.Articles.page(slider.getValue());
}
Run Code Online (Sandbox Code Playgroud)
slider.getValue() 方法返回一个包含当前页码的 int,所以基本上我必须从以下位置加载:
currentPage * articlesPerPage to (currentPage * articlesPerPage + 1) - 1
Run Code Online (Sandbox Code Playgroud)
但为了加载,我做了这样的事情:我有一个存储引擎(将其视为一个数组):
如果不是,那么我需要获取它,所以我需要发送我提到的请求,这看起来像(不考虑浏览器限制):
JSONP.send({'action':'getMeSomeArticles','start':start,'length': itemsPerPage, 函数(回调){
// 现在我只是快速解析回调以确保其一致 // 创建 DOM 元素,并填充客户端存储 // 并为用户更新视图。}}
问题在于更改滑块的速度。由于每个更改都会触发一个请求(对于正常的 Xhr 请求也会发生同样的情况),那么您基本上就跨越了所有浏览器的限制,因此如果没有节流,大多数请求将不会有“回调”。“callback”是 JSONP 请求返回的 JS 代码(这更多的是远程脚本包含)。
所以我所做的是将请求推送到优先级队列,而不是 POLL,因为现在我不需要发送多个同时请求。如果队列为空,则执行最近添加的成员,每个人都很高兴。如果不是,则取消正在进行的所有未完成的请求,并且仅执行最后一个请求。
现在,在我的特定情况下,我进行二分搜索(0(log n))来查看存储引擎是否还没有先前请求的数据,这告诉我先前的请求是否已完成。如果有,则将其从队列中删除,并处理当前的队列,否则将触发新的队列。如此等等。
再次强调,出于速度考虑和喜欢浏览器的人(例如 Internet Explorer),我提前大约 3-4 步执行上述过程。所以我提前预加载 20 页,直到所有内容都是客户端存储引擎。这样,每一个限制都被成功地解决了。
冷却时间包含在滑过 20 个页面所需的最短时间内,并且节流可确保在任何给定时间不存在超过 1 个活动请求(向后兼容至 Internet Explorer 5)。
我写这一切的原因是为了给你一个例子,试图说明你不能总是直接从 FIFO 结构强制执行延迟,因为你的调用可能需要变成用户看到的内容,而你并不想让用户等待 10-15 秒才能呈现单个页面。
另外,始终尽量减少轮询和轮询的需要(同时触发 Ajax 事件,因为并非所有浏览器实际上都能用它们来做好事)。例如,不要执行诸如发送一个请求以获取内容并发送另一个请求以在应用程序指标中查看的方式跟踪该内容之类的操作,而是在服务器级别执行尽可能多的任务!
当然,您可能希望正确跟踪错误,因此您选择的库中的 Xhr 对象实现了 ajax 的错误处理,并且因为您是一位出色的开发人员,所以您希望利用它们。
假设您有一个 try - catch 块,场景是这样的:Ajax 调用已完成,它应该返回 JSON,但调用不知何故失败了。但是,您尝试解析 JSON 并对其执行任何您需要执行的操作。所以
function onAjaxSuccess (ajaxResponse) {
try {
var yourObj = JSON.parse(ajaxRespose);
} catch (err) {
// Now I've actually seen this on a number of occasions, to log that an error occur
// a lot of developers will attempt to send yet another ajax request to log the
// failure of the previous one.
// for these reasons, workers exist.
myProject.worker.message('preferrably a pre-determined error code should go here');
// Then only the worker should again throttle and poll the ajax requests that log the
//specific error.
};
};
Run Code Online (Sandbox Code Playgroud)
虽然我见过各种尝试同时触发尽可能多的 Xhr 请求的实现,直到遇到浏览器限制,然后在阻止那些未触发的请求以等待浏览器“冷却”方面做得很好’,我可以建议你考虑以下几点:
如果第一个问题的答案是“非常”,而后一个问题的答案是“OMFG 现代技术”,那么请尝试尽可能优化您的代码和架构,以便您永远不需要同时发送 10 个 Xhr 请求。此外,对于大型应用程序,请对进程进行多线程处理。JavaScript 实现这一点的方法是使用工人。或者你可以打电话给 ECMA 委员会,告诉他们将其设置为默认值,然后将其发布到此处,以便我们其他 JS 开发人员可以享受 JS 中的本机多线程:)(dafuq 他们怎么没有想到这一点?! ?!)
Stefan,快速回答如下:
-如果是“每 x 秒最大请求数 n”,x 和 n 的常用/默认设置是什么?这听起来更像是服务器限制。浏览器通常听起来像: -“同一主机名的最大请求数是 x” -“任何主机名的最大连接数是 y”
- 有什么好的资源吗? http://www.browserscope.org/?category=network(也将鼠标悬停在表标题上以查看测量的内容) http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-连接
- 有什么方法可以检测请求是否由于速率限制而被“延迟”或“拒绝”?您可以查看“Connection: close”的 http 标头来检测服务器限制,但我不知道 JavaScript 是否能够以一致的、独立于浏览器的方式从如此多的浏览器读取设置。(对于 Firefox,您可以阅读此http://support.mozilla.org/en-US/questions/746848)
希望这个快速回答有帮助吗?
归档时间: |
|
查看次数: |
2774 次 |
最近记录: |