0

나는 Abstraced 그래프 패키지를 초기화하는 코드를 실행하고 있습니다. 그래프 인스턴스를 생성 한 후 서버로부터 get 요청으로 데이터를 얻었고 그래프 데이터 제공자를 업데이트하려고합니다. 문제는 때로는 (IE6-8 용) dataprovider를 보유하고있는 객체가 아직 초기화되지 않았기 때문에 데이터를 업데이트하려고 할 때 javascript가 충돌한다는 것입니다.JavaScript : 보증 오브젝트 초기화

개체가 준비 될 때까지 코드 지연을 어떻게 피할 수 있습니까? 의사 :

... 
... 
... 
// Init code 
$graph = new Graph(); 
... 
... 
... 
// GET request 
$.getJSON(..., ..., function(data) { 
    ... 
    ... 
    ... 
    // Make sure that $graph.series[0] is ready 
    // Should not use while, but something similar in functionality 
    while (!($graph.series && $graph.series[0])) 
    ; // Sleep the code until object is ready 

    // Set the dataprovider after init complete 
    $graph.series[0].setData(data); 
    ... 
    ... 
    ... 
}); 
... 
... 
... 

감사

오히려 당신의 while 루프에 비해

답변

0

(당신은 식별, 확실히 당신이 원하는)하는 setTimeout를 사용합니다.

$.getJSON(..., ..., function(data) { 
    processData(); 
    function processData() { 
     if (!($graph.series && $graph.series[0])) { 
      // Not ready yet, schedule to try again in a moment 
      // and quit 
      setTimeout(processData, 0); 
      return; 
     } 

     // It's there, process 
     $graph.series[0].setData(data); 
    } 
}); 

지연 이상 0 밀리 초, 물론 (일반적으로만큼이나 5-10) 수 있지만 그것은 다른 코드를 당신을 위해 그 객체를 초기화 할 수있는 기회를 제공합니다. 시간 초과를 추가하여 무언가 잘못되어도 계속 반복하지 않도록 할 수 있습니다.

그것은 우리가 아직도 getJSON 반환에서 우리의 콜백 후 data에 액세스 할 수 있는지 이상하게 보일 수 있지만, 우리가 할 수있는 processData 콜백의 컨텍스트를 통해 폐쇄 때문에, 그래서 그 맥락에서 범위의 모든에 대한 지속적인 참조가 (data 포함). 더 많은 것 : Closures are not complicated

0

나는 전에 유사한 무언가를했다. 이 코드에서는 객체 gAuto이 필요한 속성으로 초기화되었는지 확인합니다. 희망이 도움이됩니다.

function check(callback) { 
    if (gAuto.hasOwnProperty('gm_accessors_')) { 
     callback(); 
    } else { 
     console.log('waiting for init'); 
     init(callback); 
    } 
} 

function init(callback) { 
    console.log('initializing'); 
    setTimeout(function() { 
     check(callback); 
    }, 1); 
} 

init(function() { 
    console.log('init done!'); 
      // access 'gm_accessors_' here 
});