2013-10-02 4 views
0

이 텍스트 파일에서 데이터를 가져 와서 조금 구문 분석하여 몇 개의 배열로 던지기를 원합니다. 비동기 성질 인 aJax (내가 사용하고 있는지도 모르는 ...?)는 배열에 액세스하려고 시도하기 전에 배열이 채워지는 것을 의미합니다. 이것은 내가 사용자에게 사이트를 방문하는 동안 다른 시간대에 배열에 액세스해야하므로 완전히 쓸모없는 상황을 만듭니다. 어떤 아이디어?

var words = new Array(); 
var sylls = new Array(); 
var csv_file = new Array(); // for word arrays 

$(document).ready(function(){ 
    readWords(addWords); 
}); 

function readWords(process) { 
     $.get('terms.csv', function(data){ 
       csv_file = data.split('\n'); 
        // csv file is now in an array, split into seperate word array and syllable array 
        for (var i = 0; i < csv_file.length; i++) { 
         var both = csv_file[i].split(','); // split at the comma 
         words[i] = both[0]; // populate word array 
         sylls[i] = both[1]; // populate syllable array 
         //put_word(words[i], sylls[i]); 

        }; 

      }); 
    process(words, sylls); 
} 

function addWords(w, ss){ 
    console.log(w); 
} 

이 모두가 결국 빈 배열을 반환합니다.

편집 - 해결책 :

아무도 전에이 제안하지 왜 모르겠지만, 내가 같은 아약스와 좌절 당신의 사람들을 위해, 여기에 쉬운 솔루션입니다! process(words, sylls);$.get() 블록 외부처럼

var words = new Array(); 
var sylls = new Array(); 
var csv_file = new Array(); // for word arrays 

$(document).ready(function(){ 
    get_words(); 

}); 

function get_words() { 


     $.get('terms.csv', function(data){ 
      //async: false; 
      csv_file = data.split('\n'); 
       // csv file is now in an array, split into seperate word array and syllable array 
       for (var i = 0; i < csv_file.length; i++) { 
        var both = csv_file[i].split(','); // split at the comma 
        words[i] = both[0]; // populate word array 
        sylls[i] = both[1]; // populate syllable array 
        //put_word(words[i], sylls[i]); 
       }; 
      }) 
     .done(function() { 
      // once it's done DO THIS STUFF 
     }); 

} 
+1

제 제안은 promises, deferreds 및 callbacks 작동 방식을 배우고 코드를 작성하여 *** 아약스 호출의 비동기 성질과 함께 작동하도록합니다. – adeneo

+0

여기에 어떤 제안이 있습니까? – prismspecs

+1

프로세스 함수가 ​​콜백 외부에 있으므로 콜백 전에 프로세스 함수가 ​​호출되므로 콜백 함수 내에서이 함수를 이동해야합니다. – dbarnes

답변

1

그것은 보인다. .$.get()은 비동기 (기본적으로) 요청이므로 프로그램에서 호출 할 때 즉시 필요한 결과가없는 process()을 반환하고 실행합니다. $.get() 블록 끝 부분 바로 전에 process() 호출을 추가하십시오.

관련 문제