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

我需要一个通用的javascript“;“等待功能可用”;,javascript,closures,Javascript,Closures,我发现了这个优秀的代码片段,它告诉我如何在调用函数之前等待函数可用 目前,我的脚本中有这个本地代码,我已经将其组合在一起,对我有效 waitForFnc(); function waitForFnc() { if (typeof Portal.Management_Init == "undefined") { window.setTimeout(waitForFnc, 50); } else { Portal.Management_Ini

我发现了这个优秀的代码片段,它告诉我如何在调用函数之前等待函数可用

目前,我的脚本中有这个本地代码,我已经将其组合在一起,对我有效

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();
    }
}
在这里,我传递函数名,当函数可用时在其中调用该函数。上述代码不起作用,但我不确定如何解决它

问候
Paul

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

以下是您如何做到这一点:

window.setTimeout(function() {waitForFnc(fnc);}, 50);
这样做的目的是定义一个函数,就像将其写入变量一样:

var myFunc = function() {
    waitForFnc(fnc);
};
此函数尚未执行,仅定义了它。然后将其传递到“设置超时”:

这使得“setTimeout”在50秒后执行该函数。当它这样做时,它将在代码替换中调用
waitForFnc(fnc)

window.setTimeout(waitForFnc(fnc), 50);
结束时:

window.setTimeout(function() {waitForFnc(fnc)}, 50);
但是我可以问你为什么需要这么奇怪的代码吗?我更希望有一个API允许注册一些回调:

Portal.onManagementInitAvailable(fn);

您正在尝试的操作存在一些潜在问题。如果在定义门户之前调用waitForFnc(),您将得到一个null属性访问异常。如果您正在尝试一个真正通用的解决方案,那么可能必须使用eval()*gasp*

现在,让我们添加对向等待的函数传递参数的支持

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]);

根据您正在加载的内容,您可能能够利用require.js为您处理这一问题;这就是它的基本用途:

很明显,这里无法满足您的期望。我使用ASP MVC,我有一个使用ajax动态加载的部分视图。在主部分视图中,还有其他部分视图不时可见,需要使用由父部分视图动态加载的公共javascript。在初始页面加载时,子部分视图需要等待以确保在调用初始化例程之前已加载脚本。
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]);