出口从里面超时

问题描述:

的问题是,我里面有另一个的setTimeout函数:出口从里面超时

function checkBrowser() { 
    setTimeout(function() { 
    if(some.condition) //exit function checkBrowser() here 
    },5000); 
    setTimeout(/*something that mustn't run if some.condition is true*/,5000); 

} 

我需要从内部的setTimeout退出初级功能。帮帮我。

+0

为什么?在'checkBrowser'中的代码完成之前,'setTimeout'中的代码将永远不会被调用。 – aghidini

+0

在设置超时之前调用checkbrowser? – DarkBee

+0

我已经更新了这个问题。我有2个或更多setTimeouts。如果某些条件成立,则下一个setTimeouts不得运行。当条件满足时, –

你不能。代码是异步的。

第一个功能将在您传递给setTimeout的功能被调用之前完成运行并退出。

非常感谢您的帮助!我已经做了另一种说法:

function checkBrowser() { 
    setTimeout(function() { 
    if(some.condition) { 
     //something here 
    } else { 
     setTimeout(/*something that mustn't run if some.condition is true*/,5000); 
    } 
    },5000); 
} 

您在异步/智障时间表运行的条件语句,一旦你进入那个时间表是没有出路的。你必须一直保持你的逻辑,包括任何递归活动。不过,我建议您使用承诺并将所有逻辑移至then部分,以便进行函数式编程。

让我们首先逐个看看我们的功能,看看如何通过承诺实现所有功能。

确定让我们假设我们有一个名为waitAndDoStg的通用异步函数,它将数据和回调作为它的两个参数。假设我们的回调是第一种类型的错误。

var waitAndDoStg = (data,cb) => setTimeout(_=> cb(false, data.value),data.duration), 

它永远不会返回任何错误。所以经过data.duration毫秒后,它会调用我们的回调,如cb(false, data.value),并将它从我们那里获得的数据传回给我们。一个愚蠢的功能就是它。

所以好吧,我们需要promisfy这个异步函数。我们有一个标准的promisfy效用函数,它提供了任何异步函数,并为我们提供了一个承诺。回调必须是第一类错误。

promisfy = (data,func) => new Promise((v,x) => func(data,(err,res) => err ? x(err) : v(res))); 

确定的,而不是resolvereject我分别使用vx名。嗯,我想这是合理的使用vresolve,因为它看起来像一个复选标记和x罚款reject我想。

所以这里是其余的代码。它的承诺和递归,但我认为这是一个非常可读的代码。

var  promisfy = (data,func) => new Promise((v,x) => func(data,(err,res) => err ? x(err) : v(res))); 
 
    decrementByOne = n => --n, 
 
    waitAndDoStg = (data,cb) => setTimeout(_=> cb(false, data.value),data.duration), 
 
countDownPromise = n => {n && console.log(n); 
 
         promisfy({value:n, duration:1000}, waitAndDoStg) 
 
         .then(decrementByOne) 
 
         .then(val => val !== 0 ? countDownPromise(val) 
 
               : console.log("Ignition...!")); 
 
         }; 
 
countDownPromise(3);