5

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

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

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

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

问候保罗

4

4 回答 4

4

您正在尝试做的事情有一些潜在的问题。如果在 Portal 定义之前调用 waitForFnc(),你将得到一个空属性访问异常。如果您正在尝试一个真正通用的解决方案,您可能必须使用 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]);
于 2012-04-26T07:55:02.100 回答
3

基本上,当执行这行代码时: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).

于 2012-04-26T07:27:53.400 回答
0

在您的代码中替换:

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

关闭:

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

但是我可以问你为什么需要这么奇怪的代码吗?我宁愿希望有一个 API 允许注册一些回调:

Portal.onManagementInitAvailable(fn);
于 2012-04-26T07:28:26.077 回答
0

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

于 2012-04-26T08:16:39.420 回答