我试图使用PHP/wkhtmltopdf在out服务器上动态创建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);
}
}
});
})();
})发布于 2013-12-13 22:23:23
要停止计时器,只需记住从setTimeout()返回的值并在其上调用clearTimeout()。
var id = setTimeout(fn, 5000);
// then some time later
clearTimeout(id);在您向我们展示的代码中,这不应该是一个问题,除非您正在从您展示给我们的其他地方调用worker(),或者除非在创建PDF时第二次调用.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);
}
}
});
})();
})https://stackoverflow.com/questions/20577027
复制相似问题