问题是我在另一个函数中有一个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 :(得分: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)));
好的,我分别使用resolve
和reject
代替v
和x
。好吧,我想将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);