-1

非ブロッキング効果を与えるために関数で反復するsetTimeout関数の配列がありますが、任意またはすべての関数に順序フラグを付けることができます。つまり、これは前の関数が実行された後にのみ実行されます。誰かが jquery.deferred を使用するように提案してくれました。私はjquery deferredを使用したことがありません。

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

私があなたの質問を理解した場合、リストに入れる各関数には、「以前のすべての関数が実行されるまで、私を実行するのを待ってください」というフラグを付けることができます。したがって、実行する必要があるのは、実行する各関数に関数カウントとコードを追加して、カウントをデクリメントすることです。このようなもの、私はここの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;
}

それをテストするために、2つの関数を定義しました。1つ目は、タイムアウトが長い非同期をシミュレートします。2番目のフラグには待機フラグが設定されているため、最初のフラグを待機する必要があります。次に、両方をリストに追加してテストします。

// 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秒が経過するまで2番目のものは表示されません。

于 2012-09-27T18:37:20.893 に答える
0

遅延オブジェクトを使用することもできますが、タイマーを 1 つだけ使用して関数を 1 つずつ呼び出してみませんか?

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

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

next();

一部の関数が「並行して」実行でき、一部が依存している場合、事態はさらに複雑になりますが、これに関する多くの情報は提供されません。

しかし、それはどちらも大した違いはありません。Webworkers を使用しない場合、JavaScript を使用していても、すべての JavaScript が順次実行されますsetTimeout。実行順序が決まっていないだけです。

于 2012-09-27T18:16:31.547 に答える