我需要一个通用的JavaScript“等待功能可用”

问题描述:

我发现这个优秀的代码片段Make my userscript wait for other scripts to load,它告诉我如何在调用它之前等待函数可用。我需要一个通用的JavaScript“等待功能可用”

目前我已经在我的脚本这个本地代码,我已经把它为我的作品

waitForFnc(); 

function waitForFnc() { 
    if (typeof Portal.Management_Init == "undefined") { 
     window.setTimeout(waitForFnc, 50); 
    } 
    else { 
     Portal.Management_Init(); 
    } 
} 

不过,我想编写的“waitForFnc”仿制药,因为我需要做同样的在几个地方的事情。像

waitForFnc(Portal.Management_Init); 

function waitForFnc(fnc) { 
    if (typeof fnc == "undefined") { 
     window.setTimeout(waitForFnc(fnc), 50); 
    } 
    else { 
     fnc(); 
    } 
} 

其中我传递函数的名称,当它变得可用时被调用。上面的代码不起作用,但我不确定如何解决它。

问候 保罗

有一些潜在的问题,你试图做什么。如果你在Portal定义之前调用waitForFnc(),你将会得到一个null属性访问异常。如果你想一个真正通用的解决方案,你可能会使用eval()*喘气*

虽然我们在这,让我们添加的参数传递给我们等待的功能支持。

function waitForFn(fnName, args){ 
    var fn; 
    try{ 
     eval("fn = " + fnName); 
     if(fn){ 
      fn.apply(null, args); 
     }else{ 
      setTimeout(function(){waitForFn(fnName, args);}, 50); 
     } 
    }catch(e){ 
     setTimeout(function(){waitForFn(fnName, args);}, 50); 
    } 
} 

waitForFn("Portal.Management_Init", [arg0, arg1]); 
+0

感谢您的回答,它对我来说非常合适。 – 2012-04-26 12:13:50

基本上,当执行这行代码:被设置在超时之前window.setTimeout(waitForFnc(fnc), 50);,将“waitForFnc”进行评价。而您需要将调用语句作为参数传递。

这里是你如何做到这一点:

window.setTimeout(function() {waitForFnc(fnc);}, 50); 

这里做的事情,它定义了一个功能,如果你愿意把它写到变量以同样的方式:

var myFunc = function() { 
    waitForFnc(fnc); 
}; 

此功能尚未执行,只是定义。然后你将它传递到“setTimeout”:

window.setTimeout(myFunc, 50); 

这使得“setTimeout”在50毫秒后执行该函数。当它发生时,它会调用waitForFnc(fnc)

在你的代码替换:

window.setTimeout(waitForFnc(fnc), 50); 

与封闭:

window.setTimeout(function() {waitForFnc(fnc)}, 50); 

但我会问你为什么需要这样一个奇怪的代码?我宁愿期望有一个API允许注册一些回调:

Portal.onManagementInitAvailable(fn); 
+1

显然,你的期望就不会在这里得到满足。 – Chuck 2012-04-26 07:37:27

+0

我使用ASP MVC,我有一个动态加载ajax的部分视图。在主要部分视图中,还有其他部分视图会不时显示,需要使用由父部分视图动态加载的常见JavaScript。在初始页面加载时,子部分视图需要等待以确保脚本在调用初始化例程之前已被加载。 – 2012-04-26 12:17:43

根据您正在加载的内容,您可能可以利用require.js为您处理此问题;这基本上就是它的功能:http://requirejs.org/docs/why.html#9