JavaScript同步多个函数调用

JavaScript synchronise multiple function calls

本文关键字:函数调用 同步 JavaScript      更新时间:2023-09-26

我有一个文档,它有两个javascript函数A();B();。这些函数的调用顺序不特定,我想在最后一次调用时做点什么。

我可以通过使用局部变量来完成任务,但在这样做之前,我想确认是否有更优雅/更稳健的方法来实现这一点——我可能有两个以上这样的函数,这使得局部vars解决方案变得一团糟。

更新1-更多详细信息

我在一个页面上有几个SilverLight插件,每个插件都有

<param name="onLoad" value="pluginLoaded" />

我只能说"pluginLoaded"没有参数什么都没有。

插件以绝对随机的顺序加载,完成后我想调用另一个函数。

我们通过重新定义函数来实现这一点:

您现在拥有:

function A() { /* do something */ }
function B() { /* do something */ }
function FinalCurtain() { /* do something after A and B have been called*/ }

就这么做吧编辑:在要求"我希望doA和doB每个只调用一次"之后

function DoA() { /* do something */ }
function DoB() { /* do something */ }
function DoFinalCurtain() { /* do something after A and B have been called*/ }
function A() {
   DoA();
   B=function() {DoB(); FinalCurtain();}
   A=function() {}
}
function B() {
   DoB();
   A=function() {DoA(); FinalCurtain();}
   B=function() {}
}
function FinalCurtain() {
   DoFinalCurtain();
   //Remove next 2 lines if you do NOT want to start the process over once DoFinalCurtain() has beenm called.
   A=function() {DoA();}
   B=function() {DoB();}
}

将HTML更改为以下内容:

<param name="onLoad" value="My_firstPluginLoaded" />
...
<param name="onLoad" value="My_secondPluginLoaded" />
...
<param name="onLoad" value="My_thirdPluginLoaded" />

然后在你的页面上有这样的代码:

var loadedPlugingCount = 0;
var totalPlugins = 3;
function My_firstPluginLoaded() {
    loadedPlugingCount++;
    firstPluginLoaded();
}
function My_secondPluginLoaded() {
    loadedPlugingCount++;
    secondPluginLoaded();
}
function My_thirdPluginLoaded() {
    loadedPlugingCount++;
    thirdPluginLoaded();
}
function CheckAllCompleted() {
    if (loadedPlugingCount === totalPlugins) {
        alert("All done!");
        return true;
    }
    window.setTimeout(CheckAllCompleted, 10);
    return false;
}
CheckAllCompleted();

想法很简单:有自己的函数,在调用真正的回调之前增加全局计数器,然后检查计数器,直到达到所需的计数。

我有一个想法,但我不确定它是否足够优雅。

您需要一个全局变量:

functionsCalled = {};

AB都需要用recordCall(arguments.callee) 调用的一个函数

function recordCall(fn){
  functionsCalled[fn] = 1;
}

最后是一个函数,它接受一个函数数组,检查每个函数是否被调用,如果被调用,则调用某个函数。你可以称之为haveBeenCalled([A, B], function { ... });

function haveBeenCalled(fns, fn) {
  for(var i = 0; i < fns.length; i++) {
    if(fns[i] !== 1) return;
  }
  return fn();
}