-1

我有一个函数数组可以用setTimeout函数迭代以提供非阻塞效果,但是任何或所有函数都可以有顺序标志,这意味着只有在之前的函数执行后才能执行。有人建议我使用 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};
4

2 回答 2

0

您可以使用延迟对象,但为什么不只使用一个计时器并一一调用函数呢?

var funcs = [/* array of functions */];

function next() {
    var func = funcs.shift();
    if(func) {
        func();
        setTimeout(next, 100);
    }
}

next();

如果某些功能可以“并行”运行并且某些功能是依赖的,那么事情会变得更加复杂,但是您没有提供很多关于此的信息。

但这也不会有太大的不同。如果您不使用 webworkers,任何 JavaScript 都会按顺序运行,即使您使用setTimeout. 只是执行顺序没有确定。

于 2012-09-27T18:16:31.547 回答
0

如果我理解您的问题,您放入列表中的每个函数都可以有一个标志,上面写着“等待执行我,直到所有先前的函数都已执行”。因此,您需要做的是向您执行的每个函数添加函数计数和代码以减少计数。像这样,我在 jsFiddle 中放了一份副本

var funcCount = 0, funcList = [];

function executeFunctions() {
    var nextFunc;

    while (funcList.length > 0) {
        // Check next in list, if we need to wait, make sure we wait
        nextFunc = funcList[0];
        if (nextFunc.needToWait) {
            if (funcCount > 0) {
                // Try again later
                setTimeout(executeFunctions, 100);
                return;
            }
        }

        // Since we are now going to execute, remove from list and execute
        funcList.splice(0, 1);
        funcCount += 1;    // nextFunc will subtract 1 on completion
        setTimeout(nextFunc, 100);
    }
}

// For async functions to call back to completion
function completionCallback() {
    funcCount -= 1;
}

为了测试它,我定义了两个函数。第一个模拟具有长超时的异步。第二个设置了等待标志,因此它需要等待第一个。然后我将它们都添加到列表中并进行测试:

// 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 秒过去之前,第二个不会出现。

于 2012-09-27T18:37:20.893 回答