在我的项目中,我有一个长期运行的过程,被AJAX调用。持续时间可以是1到15分钟。
在运行AJAX的同时,我想向用户提供更新。它只应该显示出要添加到数据库中的剩余行数。
我发现有几种不同的选择可以实现这一目标。轮询,SSE或WebSockets。我从未使用过WebSockets,也找不到很好的例子。
我现在正在尝试使用非常了解的SSE,它正在正常工作..但是当AJAX开始运行时,到eventSource的连接将处于挂起状态。因此,当AJAX运行时,没有收到更新。
代码:
<script type="text/javascript">
var es;
function checkProgress(id){
es = new EventSource('checkProgress.php');
es.addEventListener('message', function(e) {
console.log(e.data);
}, false);
}
checkProgress(1);
$(function() {
$('.submit').on('click', function() {
var form = $('form')[0];
var form_data = new FormData(form);
$.ajax({
type: 'POST',
url: 'submit.php',
contentType: false,
processData: false,
data: form_data,
success:function(response) {
console.log(response);
}
});
return false;
});
});
</script>
屏幕截图:
现在实际上,在运行AJAX进程时,我仍然找不到如何实现SSE的任何参考或示例。所有参考或示例都提供了示例,以使getProgress文件能够执行某些操作。
答案 0 :(得分:0)
我看到您正在使用PHP。我最好的猜测是您还使用内置的PHP会话管理。问题在于,访问会话是排他的操作。我想您的AJAX操作已打开并锁定了会话,从而阻止了SSE脚本也打开了会话。您可以考虑使用not opening the session or opening it read-only。