2012-04-19 5 views
1

크롬 개발자 도구를 기반으로 할 때 중단 점은 내가 알아낼 수있는 범위 문제를 처리하고 있다고 생각합니다. 함수를 정의하는 방식입니까? 아래의 스크립트는 include js 파일과 array 'timeStamp입니다. 매번 loadData 함수를 호출 할 필요없이 다른 함수에서 사용할 수 있기를 원합니다.자바 스크립트가 범위를 벗어났습니다.

timeStamp 배열은 함수를 떠나기 전에 for 루프를 벗어나면 정의되지 않습니다.

var timeStamp = []; // Want this array to be global 

function loadData (url){ 

     $.getJSON(url, function(json) { 

      for (var i=0;i<json.length;i++){ 
        timeStamp.push(json[i].TimeStamp); 
       } 
        console.log(inputBITS); //returns the value 
      }); 
     console.log(inputBITS); //undefined 
     } 

는 anyhelp

답변

6

문제가 getJSON 비동기라는 것이다처럼 보이는 주셔서 감사합니다. 코드가 실행되고 끝나고 코드가 계속되면 데이터를 검색 할 네트워킹 작업의 시작 만 나타냅니다. 실제 네트워킹 작업은 얼마 후 완료 될 때까지 완료되지 않습니다.

완료되면 성공 처리기가 호출되고 (getJSON() 호출의 두 번째 인수로 지정됨) timeStamp 배열을 채 웁니다. 성공 처리기가 호출 된 후에 만 ​​timeStamp 배열이 유효합니다.

이와 같이 getJSON() 호출 바로 뒤에있는 코드에 timeStamp 배열을 사용할 수 없습니다 (아직 채워지지 않았습니다). 다른 코드에 timeStamp 배열이 필요한 경우 해당 코드를 성공 처리기에서 호출하거나 다른 타이밍 메커니즘을 사용하여 timeStamp 배열을 사용하는 코드가 성공 처리기가 호출 될 때까지 사용하려고하지 않는지 확인해야합니다. timeStamp 배열이 채워집니다.

일부 Ajax 호출을 비동기가 아닌 동기식으로 설정할 수는 있지만 일반적으로 뷰어에게 불만족스러운 전체 네트워킹 작업 중에 브라우저를 잠그기 때문에 일반적으로 매우 바람직하지 않습니다. 비동기 네트워킹과 함께 작동하도록 코딩 논리를 수정하는 것이 훨씬 좋습니다.

function loadData (url){ 

    $.getJSON(url, function(json) { 
     // this will execute AFTER the ajax networking finishes 
     var timeStamp = []; 
     for (var i=0;i<json.length;i++) { 
       timeStamp.push(json[i].TimeStamp); 
     } 
     console.log(timeStamp); 
     // now call other functions that need timeStamp data 
     myOtherFunc(timeStamp); 
    }); 
    // this will execute when the ajax networking has just been started 
    // 
    // timeStamp data is NOT valid here because 
    // the ajax call has not yet completed 
    // You can only use the ajax data inside the success handler function 
    // or in any functions that you call from there 
} 
+0

설명해 주셔서 감사합니다. 성공 핸들러를 확인하려고합니다. – rd42

+1

@ rd42 - 이미 성공 처리기가 있습니다. getJSON 호출의 두 번째 인수로 선언 된 익명의 함수입니다. Ajax 호출이 성공적으로 완료 될 때 호출되는 함수입니다. 아약스 네트워킹이 완료된 후 얼마 후 호출됩니다. – jfriend00

+0

나는 약간 혼란 스럽다. 두 console.logs() 함수에 있지만 하나만 정의 된 및 배열을로드 할 때까지 두 번째 console.log() 호출되지 않는, 오른쪽? – rd42

2

을 그리고 여기에 기본 AJAX를 이해하지 못하는 다른 사람의

getJSON비동기입니다 ... 다음과 같이

이 같은 Ajax 호출의 일반적인 디자인 패턴이다. 의미, 코드는 함수 호출 후에 JSON 요청이 성공적으로 반환되기 전에 계속 실행됩니다.

당신은 적절한 플래그 동기로 요청을 강제로이 문제를 "해결"할 수 있지만, 그 어떤의 가장 많은 이유 (대한 정말 나쁜 생각이 의 기본 개념을 위반하고 있다는 것입니다 JAX). 가장 좋은 방법은 AJAX의 작동 방식을 기억하고 대신 AJAX가 반환 할 때 실행해야하는 모든 코드를 올바른 위치에 저장하는 것입니다.

+0

감사합니다. 내가 할 수있는 '적당한 장소'외에 다른 용어가 있습니까? – rd42

+1

정의한 익명 함수에 넣으면됩니다. 여기서 기록되는 변수에 대한 올바른 값을 볼 수 있습니다. –

관련 문제