我正在尝试使用PHP / wkhtmltopdf在Web服务器上动态创建PDF,这涉及将PDF生成过程发送到后台以防止页面超时。
为了检查作业是否成功完成,我使用了Javascript(我吮吸),更具体地说是jQuery / AJAX来连续查询服务器,看看wkhtmltopdf的进程是否已经结束。如果它仍在运行,PHP脚本将不返回任何内容,只是退出。如果流程已成功结束,则会生成指向PDF的html链接,然后将其转储到<div></div>
。
所有服务器端代码都完美无缺,但是我仍然坚持使用Javascript组件。下面的代码有点工作,但不是在生成PDF后停止计时器,它继续查询服务器。我怎么让它停下来?
$('#pdfmodal').on('shown', function () {
pdf(); // fire PDF generation process function
(function worker() {
$.ajax({
url: 'pdfpidcheck.php',
success: function(data) {
if(data == ''){
// Schedule the next request if nothing returned (i.e. still running)
setTimeout(worker, 5000);
} else {
// dump link to pdf
$('.pdfmodal').html(data);
}
}
});
})();
})
答案 0 :(得分:2)
要停止计时器,您只需记住setTimeout()
的返回值并在其上调用clearTimeout()
。
var id = setTimeout(fn, 5000);
// then some time later
clearTimeout(id);
在您向我们展示的代码中,这不应该是一个问题,除非您从其他地方调用worker()
而不是您向我们展示的内容,或者除非.on()
处理程序第二次被调用正在创建PDF。您当前的代码看起来并不像它知道如何处理同时创建的两个PDF,或者在第一个仍在处理时触发的第二个甚至触发。
你可以防止这样运行的多个计时器:
$('#pdfmodal').on('shown', function () {
var modal = $(this);
pdf(); // fire PDF generation process function
(function worker() {
$.ajax({
url: 'pdfpidcheck.php',
success: function(data) {
var timer = modal.data(timer);
if(data == ''){
// make sure we never have more than one timer running
if (timer) clearTimeout(timer);
// Schedule the next request if nothing returned
// (i.e. server process still running)
timer = setTimeout(worker, 5000);
// save timer for later use
modal.data("timer", timer);
} else {
// clean up timer data
if (timer) clearTimeout(timer);
modal.removeData("timer");
// dump link to pdf
$('.pdfmodal').html(data);
}
}
});
})();
})