Javascript jquery延迟设置超时循环
我有一个函数数组,可以使用Javascript jquery延迟设置超时循环,javascript,jquery,settimeout,jquery-deferred,Javascript,Jquery,Settimeout,Jquery Deferred,我有一个函数数组,可以使用setTimeout函数进行迭代,以提供非阻塞效果,但任何或所有函数都可以有order标志,这意味着只有在执行了以前的函数之后才能执行。有人建议我使用jquery.deferred。我从来没有使用过jquery while(that.funcns.length>0){ fn=that.funcns.splice(0,1)[0]; fn.idx=i; window.setTimeout(function(){ fn.ref(); //call f
setTimeout
函数进行迭代,以提供非阻塞效果,但任何或所有函数都可以有order标志,这意味着只有在执行了以前的函数之后才能执行。有人建议我使用jquery.deferred。我从来没有使用过jquery
while(that.funcns.length>0){
fn=that.funcns.splice(0,1)[0];
fn.idx=i;
window.setTimeout(function(){
fn.ref(); //call function reference
},(idx==0)?idx:1000);
}
//fn - {ref:functionReference,order:true/false};
您可以使用延迟对象,但为什么不使用一个计时器并逐个调用函数呢
var funcs = [/* array of functions */];
function next() {
var func = funcs.shift();
if(func) {
func();
setTimeout(next, 100);
}
}
next();
如果有些函数可以“并行”运行,而有些函数是依赖的,事情就会变得更加复杂,但是您没有提供很多关于这方面的信息
但这也没有多大区别。如果您不使用webworkers,任何JavaScript都会按顺序运行,即使您使用
setTimeout
。只是执行顺序还没有确定。如果我理解您的问题,列表中的每个函数都可以有一个标志,上面写着“等待执行我,直到所有以前的函数都执行完毕”。因此,您需要做的是向执行的每个函数添加函数计数和代码以减少计数。类似这样,我在JSFIDLE中放了一个副本:
为了测试它,我定义了两个函数。第一种方法模拟长超时的异步。第二个设置了wait标志,因此它需要等待第一个。然后我将它们都添加到列表中并对其进行测试:
// Example function 1 is simulated async
function example1() {
alert("Example1");
// Simulate async call with completion callback function, e.g. XHttpRequest
setTimeout(completionCallback, 2000);
}
example1.needToWait = false; // Not flagged
// Example function is flagged as need others to complete first
function example2() {
alert("Example2");
funcCount -= 1;
}
example2.needToWait = true;
// Setup function list to execute example1 then example2
funcList.push(example1);
funcList.push(example2);
// OK, test it
executeFunctions();
如果将function2标志更改为false,则会立即逐个显示警报框。如果您将其保留为true,则第二个选项直到2秒后才会显示。google'jquery deferred'我已经这样做了,但找不到适合我的选项。什么是
I
,idx
和ref
?告诉我们有关那些“funcn”对象的信息。ref是对函数的引用。是的,我知道,但我从我的一个客户那里得到了要求,显然是技术性的,他想用其他语言实现它,就像线程一样。请看我的补充。这并不重要,因为JavaScript总是单线程的。您不能同时运行两个函数(除非您使用webworkers,这是一个完全不同的故事)。@Felix Kling,如果函数包含XHTPrequest或其他浏览器异步调用怎么办?@AresAvatar:那么延迟对象将非常有用。然而,OP没有提到这些功能在做什么。一如既往:更多信息->更好的答案;)@显然,函数可以做任何事情。我需要告诉你吗?
// Example function 1 is simulated async
function example1() {
alert("Example1");
// Simulate async call with completion callback function, e.g. XHttpRequest
setTimeout(completionCallback, 2000);
}
example1.needToWait = false; // Not flagged
// Example function is flagged as need others to complete first
function example2() {
alert("Example2");
funcCount -= 1;
}
example2.needToWait = true;
// Setup function list to execute example1 then example2
funcList.push(example1);
funcList.push(example2);
// OK, test it
executeFunctions();