【问题标题】:How to stop function如何停止功能
【发布时间】:2012-08-10 10:48:14
【问题描述】:

在这里我找到了一个循环(递归函数)延迟的例子,并用于它自己的目的。问题是成功添加 div 后我需要停止循环,但这里是递归函数,因此 break 会引发错误。

我尝试过这样的事情:

(function myLoop(i){
    console.log($("input[name='show']").is(':visible'));
    if($("input[name='show']").is(':visible'))
        return false;
    setTimeout(function(){
        $.getScript('index.php?ping=true', function(data){
            if(ping){
                $('#input').append('<input width="320" type="image" height="240" border="0" src="http://'+url+':'+port+'/?up" name="show">');
            }
        });
        if (--i) myLoop(i);
    }, 7000)
})(10);

但它仅在添加第二个 div 后才会停止。据我了解,我需要以某种方式在 if 上使用回调?

更新: 自己解决了问题,只添加了 if (--i) myLoop(i);到getscript

【问题讨论】:

  • 为什么不使用 setInterval/clearInterval 而不是递归呢?
  • 请创建一个演示:jsfiddle.net

标签: javascript jquery loops recursion


【解决方案1】:

一个更好的方法可能是在函数失败时再次调用该函数,并设置一个限制或类似的东西:

var i=0, limit=10;

function getSomething() {
    if (!$("input[name='show']").length) {
        var XHR = $.getScript('index.php?ping=true');
        XHR.done(function(data){
            if(ping){
                $('#input').append('<input width="320" type="image" height="240" border="0" src="http://'+url+':'+port+'/?up" name="show">');
            }
        }).fail(function() {
            if (i<limit) setTimeout(getSomething, 7000);
            i++;
        });
    }
});    

setTimeout(getSomething, 7000);

检查元素是否存在真的不是必需的,因为它可能不会存在,直到函数不再失败等。另外,你从哪里得到变量 ping、url 和 port,因为它们没有在任何地方定义?

【讨论】:

  • if(ping == 'true'){ $('#input').append(''); } else if (--i) myLoop(i);
【解决方案2】:

您需要存储对您的setTimeout 的引用和使用clearTimeout

var timeout = setTimeout(function(){
    if (success) {
        clearTimeout(timeout); 
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    相关资源
    最近更新 更多