这是一种实现方法,但请注意,这并不是最佳实践,特别是如果您需要对AJAX请求的结果进行进一步处理时。
<h2>jQuery</h2>
假设您像下面这样发起AJAX请求:
$(document).ready(function() {
$.ajax({
type: 'POST',
url: 'myscript.php',
data: {'val1':val1,'val2':val2, /* 更多数据 */},
timeout: 100, // 关键部分在于设置超时时间
success: function(data) {
// 在成功回调中执行操作,尽管这里可以留空
},
error: function (jqXHR, textStatus, errorThrown, desc, err) {
if(textStatus === "timeout") {
// 超时时执行其他操作
} else {
// 处理非超时错误的情况
}
}
});
});
这里的要点在于timeout
属性。它会中断挂起的AJAX请求,意味着JavaScript不会等待响应,但服务器端脚本(即myscript.php
)仍将继续执行。
<h2>原生JavaScript</h2>
如果不使用jQuery,您可以用纯JavaScript实现类似的功能:
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("POST", "myscript.php", true);
// 发送带有数据的请求
xmlHttp.send(JSON.stringify({
val1 : val1,
val2 : val2,
// 其他数据项...
}));
xmlHttp.onload = function(e) {
// 检查请求是否成功
if (this.readyState === XMLHttpRequest.DONE && (this.status === 201 || this.status === 200)) {
clearTimeout(xmlHttpTimeout);
// 在成功响应时执行相应操作
}
}
// 设置100毫秒后超时并终止请求
var xmlHttpTimeout = setTimeout(ajaxTimeout, 100);
function ajaxTimeout(){
xmlHttp.abort();
// 在发起AJAX请求后通常要执行的操作
}
如果不确定AJAX请求是否到达了后端,并且控制台和网络面板中没有报错,您可以采取以下步骤进行测试。
首先,创建一个名为test.php
的脚本,在其中放置以下代码:
<?php
sleep(15);
$filename = "zztest.txt";
$file = fopen($filename, 'a+');
fwrite($file, date("Y-m-d H:i:s"));
sleep(5);
fwrite($file, PHP_EOL . date("Y-m-d H:i:s") . PHP_EOL . "********" . PHP_EOL);
fclose($file);
?>
这个脚本将会执行以下操作:
- 初始化时先等待15秒(由
sleep(15)
实现)
- 创建(或打开已存在的)一个
.txt
文件,并写入当前日期和时间
- 保持文件打开状态 —— 注意在fwrite之后没有立即调用
fclose(...)
。在一般情况下这不是一个好的做法,因为有可能出现脚本执行中断导致文件被锁定,但在本例中,出于测试目的这样做是可以接受的。
- 写入日期和时间后,再等待5秒(
sleep(5)
),然后再次写入当前日期和时间,中间用换行符PHP_EOL
隔开。
- 最后,关闭文件
接下来,请将AJAX请求中的myscript.php
替换为test.php
调用,其余AJAX配置保持不变。
然后像平常一样执行AJAX请求,等待大约20秒,检查是否创建了一个名为zztest.txt
的文件以及文件内容是什么。
如果文件没有被创建,则问题可能出在前端(AJAX调用)。