出口从里面超时
问题描述:
的问题是,我里面有另一个的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退出初级功能。帮帮我。
答
你不能。代码是异步的。
第一个功能将在您传递给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)));
确定的,而不是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);
为什么?在'checkBrowser'中的代码完成之前,'setTimeout'中的代码将永远不会被调用。 – aghidini
在设置超时之前调用checkbrowser? – DarkBee
我已经更新了这个问题。我有2个或更多setTimeouts。如果某些条件成立,则下一个setTimeouts不得运行。当条件满足时, –