取消XHR请求
取消XHR请求
我有:\n
function send(){ $.get("/site/send.php", function(data){ alert(data); } }
\n在site/send.php中我有:\n
sleep(1000) echo "OK";
\n接下来我在我的js文件中有:\n
send(); $("#click").click(function(){ $.get("/site/reset.php", function(data){ alert(data); } })
\n在reset.php中有:\n
echo "RESET";
\n在这个例子中,我在sleep小于1000之前一直有XHR。在Firebug中我看到这个。在函数send()中,直到sleep小于1000才有响应和成功。这是正常的,但如果我使用.click(),我想取消这个请求。现在我一直有send()函数,直到它停止(> 1000)才能开始使用.click()函数。为什么这个不是异步的?\n这可能吗?也许可以取消站点上的所有请求?
取消XMLHttpRequest(XHR)请求的问题通常出现在客户端。每个请求都是一个独立的实例或线程,无法通过发出另一个请求来取消某个请求。然而,可以在客户端上取消当前的请求。以下是解决该问题的方法:
1. 使用abort()方法取消请求。可以在XMLHttpRequest对象上调用abort()方法来取消请求。例如:
var xhr = new XMLHttpRequest(); xhr.open("GET", "example.com/api/data", true); xhr.send(); // 取消请求 xhr.abort();
2. 使用Promise和async/await取消请求。可以使用Promise和async/await结合来取消请求。例如:
function makeRequest() { return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open("GET", "example.com/api/data", true); xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { resolve(xhr.responseText); } else { reject(xhr.statusText); } }; xhr.onerror = function() { reject(xhr.statusText); }; xhr.send(); }); } // 取消请求 var request = makeRequest(); async function cancelRequest() { try { const response = await request; // 处理响应数据 } catch (error) { console.error(error); } } cancelRequest();
这些方法可以在客户端上取消XMLHttpRequest请求,以解决取消请求的问题。无论是使用abort()方法还是结合Promise和async/await,都可以有效地取消请求并处理相应的逻辑。
取消XHR请求的原因是为了避免不必要的网络请求或中止已经发送的请求。要解决这个问题,需要保存XHR对象的引用,并在需要时中止它。以下是解决方法的代码示例:
var myXhr = null; $("#click").click(function(){ myXhr = $.get("/site/reset.php", function(data){ alert(data); }); }) if (myXhr) { myXhr.abort(); }
上述代码中,当点击id为"click"的元素时,发送一个GET请求到"/site/reset.php"。在发送请求之前,将XHR对象赋值给变量myXhr。如果需要中止请求,可以调用myXhr.abort()方法来中止XHR请求。
如果对语法不确定,可以参考类似的问题,如以下链接中的一些问题:
- [How to you abort/cancel a request using the Prototype JS library](https://stackoverflow.com/questions/3161700)
- [Abort Ajax POST](https://stackoverflow.com/questions/7565798)
- [How to cancel/abort jQuery AJAX request?](https://stackoverflow.com/questions/4551175)