首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止Javascript计时器

停止Javascript计时器
EN

Stack Overflow用户
提问于 2013-12-13 22:21:51
回答 1查看 129关注 0票数 1

我试图使用PHP/wkhtmltopdf在out服务器上动态创建PDF,这涉及到将PDF生成过程发送到后台,以防止页面超时。

为了检查任务是否已经成功完成,我使用了Javascript (我很糟糕),更具体地说,使用jQuery/AJAX来不断地查询服务器,查看wkhtmltopdf的进程是否已经结束。如果它仍在运行,PHP脚本将不返回任何内容,而只是退出。如果进程已成功结束,则生成指向PDF的html链接,然后将其转储到<div></div>中。

所有服务器端代码都完美无缺地工作,但是我仍然停留在Javascript组件上。下面的代码有点工作,但没有计时器停止后,PDF已经产生,它继续查询服务器。我怎么才能让它停下来?

代码语言:javascript
复制
$('#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);
                 }
             }
         });
    })();
})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-13 22:23:23

要停止计时器,只需记住从setTimeout()返回的值并在其上调用clearTimeout()

代码语言:javascript
复制
var id = setTimeout(fn, 5000);

// then some time later
clearTimeout(id);

在您向我们展示的代码中,这不应该是一个问题,除非您正在从您展示给我们的其他地方调用worker(),或者除非在创建PDF时第二次调用.on()处理程序。您的当前代码似乎不知道如何处理同时创建的两个PDF,甚至不知道如何处理第一个还在处理中触发的第二个PDF。

您可以防止多个计时器像这样运行:

代码语言:javascript
复制
$('#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);
                 }
             }
         });
    })();
})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20577027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档