Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在超时、成功或超过最大尝试次数时多次尝试函数_Javascript_Settimeout - Fatal编程技术网

Javascript 在超时、成功或超过最大尝试次数时多次尝试函数

Javascript 在超时、成功或超过最大尝试次数时多次尝试函数,javascript,settimeout,Javascript,Settimeout,我想知道在Javascript中是否有可能调用一个函数多达N次以获得真实值。如果返回值为true,则应立即返回。无论N次后返回值是多少,它至少应该返回 我仔细阅读了一下现有的资源,得出了这样的结论:这是不可能的,但通常是通过回调函数来完成的。有任何模式/最佳实践/示例吗?我提出了以下实现: multitry = function(time, tries, func, callback) { counter = 0; timer = setInterval(function() {

我想知道在Javascript中是否有可能调用一个函数多达N次以获得真实值。如果返回值为
true
,则应立即返回。无论N次后返回值是多少,它至少应该返回


我仔细阅读了一下现有的资源,得出了这样的结论:这是不可能的,但通常是通过回调函数来完成的。有任何模式/最佳实践/示例吗?

我提出了以下实现:

multitry = function(time, tries, func, callback) {
    counter = 0;
    timer = setInterval(function() {
        ((success = func(++counter)) || (counter >= tries))
            && !clearInterval(timer) 
            && callback(success, counter)      
        ;
    }, time);
};
例如,如果已启用标记编辑,则每250毫秒尝试30次,可以运行以下操作:

javascript:(function(){
    multitry = function(time, tries, func, callback) {
        counter  = 0;
        timer    = setInterval(function() {
            counter++;
            var value = func(counter);
            if (value || counter >= tries) {
                clearInterval(timer);
                callback(value, counter);
            }
        }, time);
    };
    multitry(
        250, 
        30, 
        function() {
            return $('#tagnames').length;
        }, 
        function (success) {
            console.log('Tag editor did open:', success);
        }
    );
}());

我提出了以下实施方案:

multitry = function(time, tries, func, callback) {
    counter = 0;
    timer = setInterval(function() {
        ((success = func(++counter)) || (counter >= tries))
            && !clearInterval(timer) 
            && callback(success, counter)      
        ;
    }, time);
};
例如,如果已启用标记编辑,则每250毫秒尝试30次,可以运行以下操作:

javascript:(function(){
    multitry = function(time, tries, func, callback) {
        counter  = 0;
        timer    = setInterval(function() {
            counter++;
            var value = func(counter);
            if (value || counter >= tries) {
                clearInterval(timer);
                callback(value, counter);
            }
        }, time);
    };
    multitry(
        250, 
        30, 
        function() {
            return $('#tagnames').length;
        }, 
        function (success) {
            console.log('Tag editor did open:', success);
        }
    );
}());

哦,天哪。只需使用if语句。没有理由用这样的布尔运算符把事情联系在一起,除非你的目标是故意让你的代码不可读……我个人不认为这是不可读的(分号可能有助于在其他地方放置更多),但这是真的,如果愿意,您可以将其封装在if语句中。@ircmaxell:我用if子句编辑了第二个示例,但在我看来,它并没有变得更具可读性。@ircmaxell:success值丢失,需要它,以便在回调中清楚是否成功。我也考虑过不使用变量,但是名称有点丢失了。哦,天哪。只需使用if语句。没有理由用这样的布尔运算符把事情联系在一起,除非你的目标是故意让你的代码不可读……我个人不认为这是不可读的(分号可能有助于在其他地方放置更多),但这是真的,如果愿意,您可以将其封装在if语句中。@ircmaxell:我用if子句编辑了第二个示例,但在我看来,它并没有变得更具可读性。@ircmaxell:success值丢失,需要它,以便在回调中清楚是否成功。我还考虑过不使用变量,但是名称有点丢失。参考:参考: