javascript异步调用
javascript async calls
i m使用jQuery Slider。在它的"更改"事件中,我做了一些繁重的JavaScript——对函数进行ajax调用(我们称之为A),并从数据库中获取结果(实际上是从Cache中获取结果,以使其更流畅)。
问题是,在我们的压力测试中,我们发现如果我们经常使用滑块,请快速将其从右向左移动——它会对客户端进行许多异步JavaScript调用,从而导致对服务器的许多查询,从而导致UI损坏。
在测试了这个问题很多时间之后,如果我在调用之间设置一个超时,它似乎可以正常工作
所以我想知道该怎么做才能避免这种情况?我怎么能确定如果用户做出这个场景,他不会看到一个坏的UI?
也许我应该使用jQuery1.5的"deferred"来检查对函数A的第一次调用的状态,并等待它完成,然后再执行对该函数的第二次调用?
这只是一个想法。
一种解决方案是,只有在滑块在特定时间(比如200ms)内没有更改的情况下才进行Ajax调用(选择适当的阈值)。
这被称为debouncing,Ben Alman创建了一个很好的jQuery插件,可以让你轻松地集成它。
您检查过悬停意图插件吗?它的设计主要是为了防止这种类型的行为发生
http://cherne.net/brian/resources/jquery.hoverIntent.html
这里有多种可能的解决方案:
取消公告
只有在滑块停止移动一定时间后才发送ajax调用。这可以防止ajax调用的快速发送,并保证ajax调用之间的发送时间永远不会少于xx。当滚动事件堆积得太快时,无法足够快地更新状态时,这种类型的行为在处理滚动事件时很常见。在每个事件中,这涉及到管理一个计时器,该计时器将在滑块移动时设置,然后在滑块停止移动一定时间后将触发,并且在暂停时间过去之前,每当滑块再移动一段时间时都会重置。
一次飞行中的单个Ajax调用
有时,所需的行为是,一旦发送了ajax调用,就不会再发送另一个,直到当前调用完成。这通常需要保留某种标志,指示您的ajax调用是否已经在运行中。如果您检测到滑块已经移动,但ajax调用正在运行,则设置另一个标志,表示ajax调用处于挂起状态。当每个ajax调用完成时,它会清除inFlight标志,并检查挂起的标志,看看是否应该再发送一个ajax调用。正确的错误处理在这里至关重要,这样inFlight标志就永远不会卡住。
强制Ajax响应按正确顺序排列
由于ajax调用是异步的,因此无法保证响应的接收顺序与请求的发送顺序相同,这有时会打乱结果。如果仍然需要发送大量ajax事件(所以您不想使用前面的任何一个选项),但结果必须按正确的顺序排列,那么可以强制将结果按正确的次序排列。这涉及到用某种序列号标记每个ajax请求,然后对无序到达的结果进行排队,直到它们的先例到达。这相当复杂,如果不是绝对需要的话,我不建议这样做。前面的选项实现起来要简单得多。
当滑块移动时,存储滑块的值并等待一小段时间(假设500毫秒),如果在该时间段内没有移动,则调用web服务,否则,如果人员在500毫秒之前移动,则只需重置滑块的存储值并再等待500毫秒。
- jasmine 2-在jasmine指定的超时时间内未调用异步回调.DEFAULT_TIMEOUT_INTERVAL
- 递归调用异步函数
- Fine Uploader S3-无处安全调用异步“;setUploadSuccessParams()"
- 调用异步函数的循环
- 从视图调用异步加载模块函数
- 在循环中调用异步函数
- JavaScript ES6 承诺在 while 循环中调用异步操作
- 并行调用异步/等待函数
- 解析云代码:如何调用异步保存的承诺
- 量角器根据条件单击嵌套元素,错误 - 在指定的超时内未调用异步回调
- 反应组件调用了两次(AJAX调用异步)
- 使用 ajax 调用异步 Web api 方法
- NodeJS:调用异步函数时谁做异步工作
- 调用异步函数 befrore 服务器开始侦听
- Node JS 动态集合 ajax 调用异步等待
- 页面重定向后调用异步成功函数
- 如何在调用异步Web服务响应时将值设置为数组
- 如何在node.js可读流中调用异步函数
- 在nodejs中,是否有更好的设计模式来同步调用异步函数
- 同步调用异步 JavaScript 函数