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