可以独立于当前状态取消异步调用吗?

时间:2016-11-16 19:31:59

标签: javascript jquery ajax throttling cancellation

当我在文本域小部件中键入文本时,我发送请求,并在其中键入每个字符以从服务器获取匹配的数据。

当我输入的速度非常快时,我使用请求吞服服务器,这导致冻结我的控制,我设法创建限制机制,我设置在发送请求之前应该等待多少ms客户端。这需要设置任意常数ms以等待。更好的解决方案是在按下下一个按键时取消发送上一个请求。

是否可以独立于当前状态取消AJAX请求?如果是,如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

致电XMLHttpRequest.abort()

请参阅:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/abort

您必须以某种方式跟踪您的请求,可能是在数组中。

requests = [];

xhr = new XMLHttpRequest(),
    method = "GET",
    url = "https://developer.mozilla.org/";

requests.push(xhr);

答案 1 :(得分:0)

MDN says :

  

XMLHttpRequest.abort()方法会中止请求(如果已经存在)   已经送走了。请求中止时,其readyState设置为0   (UNSENT),但不会触发readystatechange事件。

这里要注意的重要一点是,虽然您可以在客户端.abort()请求(因此不必担心服务器的响应),但您仍然蜂拥服务器,因为所有这些请求都是还在被送。

我的观点是,通过实施限制AJAX请求频率的机制,您第一次就做对了。你提到你有一个问题,这冻结你的控制(我假设你的意思是浏览器要么花更长的时间来响应用户的操作,或者完全停止响应),这可能表明方式存在问题您的应用程序处理异步代码

确保正确使用Promise之类的异步API,避免执行繁重处理的循环或只是在客户端代码中等待,并使事件处理(即您的AJAX回调)简单快速,以减少影响在用户身上。