2016-10-23 4 views
3

사용자 요청에 따라 서버에서 텍스트 형식의 데이터 파일을 읽는 자바 스크립트로 웹 페이지를 작성하고 있습니다. 일단 텍스트 파일이로드되면 데이터를 다소 조작해야합니다.자바 스크립트에서 텍스트 파일을 읽어야합니다.

로딩에 XMLHttpRequest를 사용하고 있지만 이제는 동기 요청이 "사용되지 않음"으로 표시됩니다. 로드되기 전에 데이터 조작을 시작할 수 없으므로이 경우 어떻게해야합니까?

+1

는 동기하지만 비동기 요청을 사용하지 않습니다에 전화를해야합니다. :) – Jite

답변

3

사용 asynchronous request :

function doGET(path, callback) { 

    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function() { 
     if (xhr.readyState == 4) { 
      // The request is done; did it work? 
      if (xhr.status == 200) { 
       // ***Yes, use `xhr.responseText` here*** 
       callback(xhr.responseText); 
      } else { 
       // ***No, tell the callback the call failed*** 
       callback(null); 
     } 
    }; 
    xhr.open("GET", path); 
    xhr.send(); 
} 

function handleFileData(fileData) { 
    if (!fileData) { 
     // Show error 
     return; 
    } 
    // Use the file data 
} 

// Do the request 
doGET("/path/to/file", handleFileData); 

또는 콜백을 처리하기 위해 더 현대적인 방법입니다 약속을 사용 : 로컬 파일을 처리하기 원하기 때문에

function doGET(path, callback) { 
    return new Promise(function(resolve, reject) { 
     var xhr = new XMLHttpRequest(); 
     xhr.onreadystatechange = function() { 
      if (xhr.readyState == 4) { 
       // The request is done; did it work? 
       if (xhr.status == 200) { 
        // Yes, use `xhr.responseText` to resolve the promise 
        resolve(xhr.responseText); 
       } else { 
        // No, reject the promise 
        reject(xhr); 
       } 
      } 
     }; 
     xhr.open("GET", path); 
     xhr.send(); 
    }); 
} 

// Do the request 
doGET("/path/to/file") 
    .then(function(fileData) { 
     // Use the file data 
    }) 
    .catch(function(xhr) { 
     // The call failed, look at `xhr` for details 
    }); 
+0

나는 이것을 잘 모른다. 이 함수에서 값을 반환하기 위해 "return"을 사용해 보았지만 아직로드되지 않았기 때문에 항상 "undefined"를 반환합니다. 또한 전역 변수를 결과와 동일하게 설정하려고했지만 아직로드되지 않았기 때문에 "undefined"로 설정됩니다. 내 전체 응용 프로그램을이 함수 안에 넣어야합니까? – OZ1SEJ

+0

요점은, 결과가 들어올 때까지는 스크립트가 계속 진행되는 것을 의미하지 않는다는 것입니다. 동기식 호출이 이제는 더 이상 사용되지 않을 것이라고 반 직관적으로 느낍니다. – OZ1SEJ

+0

@ OZ1SEJ : 동기 호출은 호출이 실행되는 JavaScript 스레드를 차단해야합니다. 이것이 기본 UI 스레드 (기본 UI 스레드) 인 경우 호출이 완료 될 때까지 페이지에서 아무 것도 일어나지 않습니다. 페이지의 UI (최소한) 또는 브라우저 (경우에 따라)를 잠급니다. 비동기 요청은 네트워크 작업이 진행되는 동안 페이지가 응답을 유지할 수있게합니다. 브라우저에서 JavaScript를 사용하려면 비동기 작업을 포용해야합니다. –

1

시도

사용 만들기 XMLHttpRequest

function readFile(file) 
{ 
    var f = new XMLHttpRequest(); 
    f.open("GET", file, false); 
    f.onreadystatechange = function() 
    { 
     if(f.readyState === 4) 
     { 
      if(f.status === 200 || f.status == 0) 
      { 
       var res= f.responseText; 
       alert(res); 
      } 
     } 
    } 
    f.send(null); 
} 

은 그럼 당신은 File:\\

readFile('File:\\\yourpath'); 
+0

예, 함수의 내부 * 결과를 경고 할 수는 있지만 함수의 결과를 * 어떻게 되 가져야합니까? 아니면 전체 응용 프로그램을 가장 안쪽 if 문에 넣어야합니까? – OZ1SEJ

+1

@ OZ1SEJ : 파일 데이터를 처리하는 코드를 인수를 허용하는 함수에 넣고 데이터가 준비되면 비동기 코드 호출을 실행하면됩니다. 그 일을 보여주기 위해 CW 응답을 업데이트했습니다. –

+0

@ T.J.Crowder 따라서 기본적으로이 함수 내에서 전체 응용 프로그램을 호출해야합니까? 또한 "CW 대답"은 무엇을 의미합니까? – OZ1SEJ

관련 문제