高效且用户友好的方式呈现缓慢加载的结果
我已经阅读了许多关于使用jQuery取消POST请求的类似问题,但似乎没有一个与我接近。
我有你的日常表单,它有一个PHP页面作为操作:
<form action="results.php">
<input name="my-input" type="text">
<input type="submit" value="submit">
</form>
根据表单中给出的帖子信息,服务器端的处理需要很长时间(30秒甚至更长时间,我们预计会增加,因为我们的搜索空间将在未来几周内增加)。我们正在访问包含所有数据的 Basex 服务器(版本 7.9,不可升级)。用户生成的 XPath 代码在表单中提交,然后操作 url 将 XPath 代码发送到返回结果的 Basex 服务器。从可用性的角度来看,我已经显示了一个“加载”屏幕,因此用户至少知道正在生成结果:results.php
$("form").submit(function() {
$("#overlay").show();
});
<div id="overlay"><p>Results are being generated</p></div>
但是,我还希望为用户提供按按钮以取消请求的选项,并在用户关闭页面时取消请求。请注意,在前一种情况下(单击按钮时),这也意味着用户应保持在同一页面上,可以编辑其输入,并立即重新提交其请求。最重要的是,当他们取消请求时,他们也可以立即重新发送请求:服务器应该真正中止,并且在能够处理新查询之前不要完成查询。
我想像这样:
$("form").submit(function() {
$("#overlay").show();
});
$("#overlay button").click(abortRequest);
$(window).unload(abortRequest);
function abortRequest() {
// abort correct request
}
<div id="overlay">
<p>Results are being generated</p>
<button>Cancel</button>
</div>
但是正如你所看到的,我不完全确定如何填写以确保post请求被中止并终止,以便可以发送新的查询。请填写空白!或者我需要提交表单,而是从jQuery进行ajax()调用?abortRequest
.preventDefault()
正如我所说,我也想停止服务器端的进程,从我所读到的内容来看,我需要这样做。但是我怎么能再做一个PHP函数呢?例如,假设我有一个处理脚本,我需要退出该脚本,我会做这样的事情吗?exit()
exit
results.php
<?php
if (isset($_POST['my-input'])) {
$input = $_POST['my-input'];
function processData() {
// A lot of processing
}
processData()
}
if (isset($_POST['terminate'])) {
function terminateProcess() {
// exit processData()
}
}
然后在我需要终止进程时执行新的ajax请求?
$("#overlay button").click(abortRequest);
$(window).unload(abortRequest);
function abortRequest() {
$.ajax({
url: 'results.php',
data: {terminate: true},
type: 'post',
success: function() {alert("terminated");});
});
}
我做了更多的研究,我找到了这个答案。它提到了connection_aborted()和session_write_close(),我不完全确定哪个对我有用。我确实使用SESSION变量,但是当进程被取消时,我不需要写掉值(尽管我想保持SESSION变量处于活动状态)。
会是这样吗?如果是这样,我如何使一个PHP函数终止另一个?
我也读过Websockets,它似乎可以工作,但我不喜欢设置Websocket服务器的麻烦,因为这需要我联系我们的IT人员,他们需要对新软件包进行广泛的测试。我宁愿把它保留给PHP和JS,没有jQuery以外的第三方库。
考虑到大多数评论和答案表明我想要的东西是不可能的,我也有兴趣听到替代方案。首先想到的是分页的Ajax调用(类似于许多网页,这些网页在无限滚动中提供搜索结果,图像,您拥有的内容)。用户将获得一个包含X个第一个结果(例如20个)的页面,当他们单击“显示接下来的20个结果”按钮时,将显示这些结果。此过程可以继续,直到显示所有结果。由于获取所有结果对用户很有用,因此我还提供了“下载所有结果”选项。这也需要很长时间,但至少用户应该能够在页面本身上浏览第一个结果。(因此,下载按钮不应中断 Ajax 页面加载。这只是一个想法,但我希望它能给你们中的一些人一些灵感。