Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jquery延迟设置超时循环_Javascript_Jquery_Settimeout_Jquery Deferred - Fatal编程技术网

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();