JavaScript同步多个函数调用

时间:2012-01-23 13:15:15

标签: javascript

我有一个文档,它有两个javascript函数A();B();。这些函数没有按特定顺序调用,我想在最后一次调用时执行某些操作。

我可以通过使用局部变量来完成任务,但在此之前我想确认是否有更优雅/更健壮的方式 - 我可能有两个以上这样的功能,这使得本地变量解决方案完整混乱。

更新1 - 更多详情

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

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

我不能比“pluginLoaded”更进一步没有任何参数。

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

3 个答案:

答案 0 :(得分:0)

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

你现在有:

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

就这么做 编辑:在要求之后“我希望doA&amp; 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();}
}

答案 1 :(得分:0)

我有个主意,但我不确定它是否足够优雅。

您需要一个全局变量:

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();
}

答案 2 :(得分:0)

将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();

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

相关问题