停止Javascript计时器

时间:2013-12-13 22:21:51

标签: javascript jquery

我正在尝试使用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);
                 }
             }
         });
    })();
})

1 个答案:

答案 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);
                 }
             }
         });
    })();
})
相关问题