2012-04-26 2 views
3

이 우수한 스 니펫 Make my userscript wait for other scripts to load은 호출하기 전에 함수를 사용할 수있을 때까지 기다리는 방법을 보여줍니다. 나는 동일한 작업을 수행하기 위해 필요로하는일반 자바 스크립트 "함수가 사용 가능할 때까지 기다려야합니다."

현재는 내가 함께 그러나 나

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

어디에서 사용할 수있을 때 호출되는 함수의 이름을 전달합니다. 위의 코드는 작동하지 않지만 해결 방법은 확실하지 않습니다.

감사 폴

답변

2

할 일에 몇 가지 잠재적 인 문제가 있습니다. 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]); 
+0

이 답변을 주셔서 감사합니다. 완벽하게 작동했습니다. –

3

기본적으로,이 코드 줄이 실행됩니다 : 제한 시간이 설정되기 전에 window.setTimeout(waitForFnc(fnc), 50);은 "waitForFnc는"평가된다. 호출 문을 매개 변수로 전달해야합니다. 여기

입니다 당신은 그렇게 할 방법 :

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

이 기능은 다음과 같습니다이 무엇

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

, 그것은 기능, 당신은 변수로 쓰기 줄 경우와 같은 방법을 정의 아직 실행되지 않은 경우에만 정의됩니다. 그런 다음 "setTimeout"에 전달하면 : "setTimeout"은 50msec 후에 해당 기능을 실행하게됩니다 :

window.setTimeout(myFunc, 50); 

그리고 전화를 걸면 waitForFnc(fnc)으로 전화 할 것입니다. 폐쇄와

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

:

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

을 그러나 당신이 그런 이상한 코드가 필요 왜 내가 요청할 수 있습니다 코드에서

0

교체? 차라리 일부 콜백을 등록 할 수있는 API가 있어야합니다.

Portal.onManagementInitAvailable(fn); 
+1

분명히 당신의 기대는 여기에 부합하지 않을 것입니다. – Chuck

+0

저는 ASP MVC를 유추하고 부분 뷰를 동적으로 아약스에로드합니다.기본 부분보기에는 때때로 볼 수있게되는 다른 부분보기가 있으며 부모 부분보기에 의해 동적으로로드되는 공통 javascript를 사용해야합니다. 초기 페이지로드시 하위 부분보기는 초기화 루틴을 호출하기 전에 스크립트가로드되었는지 확인하기 위해 대기해야합니다. –

0

로드 할 항목에 따라 require.js를 활용하여이를 처리 할 수 ​​있습니다. 기본적으로 그것이 무엇을위한 것입니까? http://requirejs.org/docs/why.html#9

관련 문제