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

Pau*_*den 5 javascript closures

我发现了这个很棒的代码片段让我的用户脚本等待其他脚本加载,它向我展示了如何在调用函数之前等待函数可用。

目前我的脚本中有这个本地代码,我已经把它放在一起对我有用

waitForFnc();

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

但是,我想编写一个通用版本的“waitForFnc”,因为我需要在几个地方做同样的事情。就像是

waitForFnc(Portal.Management_Init);

function waitForFnc(fnc) {
    if (typeof fnc == "undefined") {
        window.setTimeout(waitForFnc(fnc), 50);
    }
    else {
       fnc();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

问候保罗

jor*_*aul 5

您正在尝试做的事情存在一些潜在的问题。如果您在定义 Portal 之前调用 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]);
Run Code Online (Sandbox Code Playgroud)