从Timeout内部退出函数

时间:2016-08-18 09:27:49

标签: javascript html5 settimeout

问题是我在另一个函数中有一个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内部退出第一个函数。帮助

3 个答案:

答案 0 :(得分:1)

你不能。代码是异步的。

第一个函数将在你传递给setTimeout的函数被调用之前完成运行并退出。

答案 1 :(得分:0)

非常感谢您的帮助!我是以另一种方式完成的:

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

答案 2 :(得分:0)

您正在异步/延迟时间轴中运行您的条件,一旦您进入该时间线,就没有出路。你必须保持逻辑的所有方式,包括任何递归活动。但是我建议你使用promises并将所有逻辑移到then部分以便进行函数式编程。

让我们首先逐一掌握我们的功能,看看所有承诺是如何实现的。

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

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

它永远不会返回任何错误。因此,在data.duration毫秒传递之后,它将调用我们的回调,如cb(false, data.value),并将它从我们带回的数据传递给我们。它是一个愚蠢的功能。

好的,我们需要满足这个异步功能。我们有一个标准的promisfy实用程序函数,它可以提供所提供的任何异步函数,并向我们提供一个承诺。回调必须是第一个错误类型。

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

好的,我分别使用resolvereject代替vx。好吧,我想将v用于resolve是合理的,因为它看起来像一个复选标记,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);