是否可以取消与当前状态无关的异步调用?

是否可以取消与当前状态无关的异步调用?

问题描述:

当我键入文本,文本框我的部件我请求发送与输入到它从服务器获取匹配数据的每一个字符。是否可以取消与当前状态无关的异步调用?

当我输入真快,我蜂拥而上与要求,这将导致冻结我的控制服务器,我设法创造节流机制在哪里设置许多MS客户端应该如何发送请求之前等待。这需要设置任意的常数毫秒来等待。更好的解决方案是在按下下一个按钮时取消发送先前的请求。

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

+0

你是什么意思,“独立于它的当前状态”?不,你不能取消已经成功的请求。 – Bergi

+0

为什么你的控件冻结?请求过多?同步请求?在这两种情况下,限制请求(“等待”)是唯一的解决方案,取消在这里并不能真正帮助你。 – Bergi

呼叫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); 

MDN says :

的XMLHttpRequest.abort()方法,如果中止已经 被发送它的请求。当请求被中止时,其readyState被设置为0 (UNSENT),但readystatechange事件未被触发。

这里要注意的最重要的是,当你将能够在客户端.abort()请求(因此不必担心服务器的响应),你仍然蜂拥您的服务器,因为所有这些请求都还正在发送。

我的看法是,你有机会在第一时间,通过实施限制AJAX请求的频率的机制。你提到你与这个冻结你的控制有问题(我假设你的意思是浏览器或者需要更长的时间来响应用户的操作,或者完全停止响应),并且这可能是一个迹象,表明有与方式有问题你的应用程序处理异步代码

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