2012-08-23 3 views
1

파일에서 텍스트를 읽고 함수로 반환하고 싶습니다. 그래서 여기 내 코드의 중요한 부분이다 :파일 로딩 대기 (자바 스크립트 onload)

 function getFileRequest(id, contentType, callback) { 
     var val = "x";  

     if (window.File && window.FileReader && window.FileList && window.Blob) { 
      var element = document.getElementById(id); 

      var file = element.files[0]; 
      if(file != null) {  
       if(file.type.match("text/xml")){ 
        var r; 
        r = new FileReader(); 

        r.onload = function (e) { 
         val = e.target.result;      

        }     
        r.readAsText(file); 
       } 
       else 
        alert("Wrong file format"); 
      } 

     } else { 
      alert('The File APIs are not fully supported by your browser.'); 
     } 

     alert(val); 
     if(val == null) 
       return ""; 
      else 
       return getRequestBody(id,contentType,val); 

    } 

내가 "발"이라는 변수에 텍스트를 전달하려는. 하지만 최소한 내게 보이는 것처럼, alert (val)는 항상 onload 함수가 실행되기를 기다리지 않기 때문에 항상 기본 "x"를 표시합니다. 내가 맞습니까? 어떻게 그 텍스트에 액세스 할 수 있습니까? 예외를 기다릴 수있는 방법이 있습니까?

+0

당신은 동기와 같은 비동기 작업을 처리 할 수 . – epascarello

답변

7

물론 알림은 onload 함수에 없으므로 즉시 호출됩니다.

당신은 그렇게 할 수 있습니다 일반적인 생각이 콜백을 사용하여 연기 그래서

 var val = "x";  
     //... code to load a file variable 
     var r; 
     r = new FileReader(); 

     r.onload = function (e) { 
      val = e.target.result; 
      r.readAsText(file); 
      alert(val); 
     }; 

당신은 기다려 코드의 실행을 중지 할 수 없습니다.

는 당신이 보여 코드가 정말 파일 조작하고 그것을 사용하여 다른 하나를 수행 두 부분으로, 하나에서 수행 될 수있다 가정하면,이처럼 될 수있다 :

function fetchVal(callback) { 
     var val = "x";  
     //... code to load a file variable 
     var r; 
     r = new FileReader(); 
     r.onload = function (e) { 
      val = e.target.result; 
      r.readAsText(file); 
      callback(val); 
     }; 
} 

fetchVal(function(val){ 
    alert(val); 
    // use val 
}); 
+0

음, 물론,하지만 내가 원하는 것은이 onload 함수 외부에이 텍스트를 가져 오는 것입니다. – krajol

+0

onload 함수는 다른 함수를 호출 할 수 있지만 실행을 중지 할 수는 없습니다. –

+0

그럼 실제로 파일 텍스트를 가져 와서 alert (val)이 이제 내 버전에있는 기능에서 어떻게 반환 할 수 있는지 알고 있습니까? – krajol