clearInterval在一个场景中失败但在另一个场景中失败

时间:2012-08-10 07:18:09

标签: jquery setinterval clearinterval

我正在运行一个函数来检查数据库条目是否存在。

在我的页面加载中,我检查是否存在元素,如果存在,我使用setInterval来运行函数。像这样:

if ( $('#encoding').length ) {

    console.log("auto_update start");
    var update = setInterval(auto_update, 12000);
}

然后在我的auto_update函数中发生这种情况

function auto_update() {

    console.log("auto_update running");

    $.ajax({
        type: 'POST',
        url: ajaxurl,
        data: {
            action: "dhf_ajax_router",
            perform: "dhf_check_status", // the function we want to call
            post_id: $('#post_id').val(),
            nonce: $('#dhf-video-meta-nonce').val()
        },
        success: function(response) {

            if ( response === "continue" ) {

                console.log("still encoding");

            } else {

                clearInterval(update);
                console.log("complete " + response);
            }
        }
    });
}

问题是如果开始时页面上没有$('#encoding')并且用户手动触发了这个问题:

$(document).on("click", ".run_encode", function(){

        // doing the necessary stuff here.
        if ( response === "sent" ) {

                // more stuff
                var update = setInterval(auto_update, 12000);
        } 

}); // end .run_encode

然后clearInterval(update)不起作用,最终会无限循环。

我无法弄明白为什么。在这两种情况下都设置了名称为update的间隔,那么为什么清除它在第二种情况下不起作用?

2 个答案:

答案 0 :(得分:4)

您在函数内声明update变量。另一个函数无法访问它的值。

jfriend00就如何解决它给出了广泛的答案。我采取另一种方式:使用setTimeout。无论如何,这是推荐的,因为AJAX调用不会花费恒定的时间,但每次都会变化。想象一下,由于网络故障需要12秒以上:你会被搞砸。

答案 1 :(得分:2)

您必须确保共享变量update在两个范围内都可用。这意味着它需要位于公共父范围内,或者您需要使update变量成为全局变量,因此它不会超出范围。

最有可能的是,您声明update位于一个终止的函数内,当该函数终止时,update变量超出范围并被销毁。

您可以将变量的初始设置放入全局范围(因此当您像这样调用clearInterval()时它仍然可用:

$(document).on("click", ".run_encode", function(){

    // doing the necessary stuff here.
    if ( response === "sent" ) {

            // more stuff
            window.update = setInterval(auto_update, 12000);
    } 

}); // end .run_encode

或者,您可以将update变量声明为全局变量,首先将其置于全局级别(在任何函数之外),然后此代码将仅修改全局变量:

var update;

$(document).on("click", ".run_encode", function(){

        // doing the necessary stuff here.
        if ( response === "sent" ) {

                // more stuff
                update = setInterval(auto_update, 12000);
        } 

}); // end .run_encode