如果我理解您的问题,您放入列表中的每个函数都可以有一个标志,上面写着“等待执行我,直到所有先前的函数都已执行”。因此,您需要做的是向您执行的每个函数添加函数计数和代码以减少计数。像这样,我在 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 秒过去之前,第二个不会出现。