我有一个文档,它有两个javascript
函数A();
和B();
。这些函数没有按特定顺序调用,我想在最后一次调用时执行某些操作。
我可以通过使用局部变量来完成任务,但在此之前我想确认是否有更优雅/更健壮的方式 - 我可能有两个以上这样的功能,这使得本地变量解决方案完整混乱。
更新1 - 更多详情
我在页面上有一些SilverLight插件,每个插件都有
<param name="onLoad" value="pluginLoaded" />
我不能比“pluginLoaded”更进一步没有任何参数。
插件以绝对随机顺序加载,在整体完成时我想调用另一个函数。
答案 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 = {};
A
和B
都需要使用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();
这个想法很简单:拥有自己的函数,在调用真正的回调之前增加全局计数器,然后检查计数器,直到达到所需的计数。