通过在参数中传递停止函数来clearInterval

clearInterval by passing a stop function in parameter?

本文关键字:函数 clearInterval 参数      更新时间:2023-09-26

我正在流式传输ajax调用,如果按下"left"键,我想停止流。然而,这个函数stream_ajax是一个模板,我在我的代码中多次使用,所以我想传递一个clearInterval语句,它将检测"左"键是否被按下。

function stop() {
    $(document).keydown(function(e) {
        if(e.keyCode == 37) {
            return false;
        }
    });
}
function stream_ajax(callback, stop) {
    stream = setInterval(
        function(){
            // get page
        },
        10000
    );
    if(stop() == false) {
        clearInterval(stream);
    }
}

我的代码似乎不工作,我能够通过相同的方法获得回调工作。有人知道为什么这行不通吗?

您将希望将流传递给stop,并在keydown处理程序中执行clearInterval,如下所示:

function stop(stream) {
    $(document).keydown(function(e) {
        if(e.keyCode == 37) {
            clearInterval(stream);
        }
    });
}
function stream_ajax(callback, stop) {
    stream = setInterval(
        function(){
            // get page
        },
        10000
    );
    if (stop)  // in case no stop function was passed in
      stop(stream);
}

您的stop()函数没有显式返回值,这意味着它总是返回undefined。您拥有的return false在keydown处理程序函数中,而不是stop()的一部分。.keydown()方法分配一个新的keydown处理程序,它不测试过去是否按过一个键。

你可以这样做:

function stream_ajax(callback, stop) {
    var stream = setInterval(
        function(){
            // get page
        },
        10000
    );
    $(document).keydown(function(e) {
        if(e.keyCode == 37) {
            clearInterval(stream);
            $(document).off("keydown");
        }
    });
}

也就是说,在设置间隔后绑定一个keydown处理程序,并且在该处理程序中,如果你关心的键被按下,则清除间隔并删除keydown处理程序。