2017-12-03 6 views
0

최근에 특정 폴더의 모든 파일을 포함하는 테이블을 html로 동적으로 만들려고했습니다. 모든 파일의 목록을 포함하는 텍스트 파일을 만들기 위해 배치 파일을 만든 다음 자바 스크립트 함수에서 생성 된 텍스트 파일을 사용하여 테이블을 채우기로 결정했습니다.테이블 빌드 Javascript 함수로 인해 페이지로드시 오류가 발생합니다.

기능 showDownloads는 페이지로드라는, 다음과 같은 오류가 발생한다 :

Uncaught TypeError: Cannot read property 'length' of undefined 
    at showDownloads (script.js:8) 
    at onload ((index):9) 

그러나, 나는 콘솔에서 showDownloads()을 실행하면, 제대로 오류를 던지고없이 테이블을 생성합니다.

var downloadPath = "../builds/dev-versions/"; 
var downloads; 

function showDownloads() { 
    getData(); 
    var table = document.getElementById('downloadTable'); 

    for (var i = 0; i < downloads.length; i++) { //Error happens here 
    var row = document.createElement('tr'); 
    for (var j = 0; j < downloads[i].length; j++) { 
     var cell = document.createElement('td'); 
     var file = document.createElement('a'); 
     file.setAttribute('href', downloadPath + downloads[i][j]); 
     file.setAttribute('download', downloads[i][j]); 
     file.innerHTML = downloads[i][j]; 

     cell.appendChild(file); 
     row.appendChild(cell); 
    } 
    table.appendChild(row); 
    } 
} 

function getData() { 
     var xmlhttp; 

     if (window.XMLHttpRequest) { 
      xmlhttp = new XMLHttpRequest(); 
     } 
     else { 
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 

     xmlhttp.onreadystatechange = function() { 
      if (xmlhttp.readyState == 4) { 
      var lines = xmlhttp.responseText; 

      intoArray(lines); 
      } 
     } 

     xmlhttp.open("GET", "devFiles.txt", true); 
     xmlhttp.send(); 
} 

function intoArray (lines) { 

    var lineArr = lines.split('\n'); 
    lineArr.pop(); 

    downloads = new Array(lineArr.length/2); 

    var j = 0; 
    for (var i = 0; i < lineArr.length; i += 2) { 
    downloads[j] = [lineArr[i], lineArr[i + 1]]; 
    j++; 
    }; 
} 

은 왜 배열 downloads는 첫 번째 호출시에 정의되지 않은 것으로 간주됩니다?

getData을 호출하면 왜 생성되지 않습니까?

+1

작성되었습니다 .... 그냥 비동기 .... 그리고'promises'와'.then'을 사용하지 않기 때문에'getData()'가 실제로 데이터를 얻기 전에 코드가 계속됩니다. 나중에 (콘솔을 열고 타입을 입력 할 때까지) 작동한다. – Dellirium

+0

Ahhh ... 나는 이것이 문제가 될 수 있다는 것을 몰랐다. 나는 프로그래밍에 익숙하지 않았기 때문에'getData()'이 기본적으로 완료되기 전에'promises'와'.then'을 살펴볼 것입니다. 감사합니다. – IsenfireLDC

+0

'getData'가 완료되었지만,'getData' 그 함수의 결과는'downloads' 변수에 존재하지 않습니다. 즉, HTTP 요청을 처리하는 데 사용되는 이벤트 처리기 인 onreadystatechange는 이름이 읽기 전이 변경되면 해방을 말합니다. 'downloads' 변수에 액세스하려고 시도합니다. 실제로 액세스하려고 시도하기 전에는 실제로 실행되지 않습니다.이 때문에 동기화와 비동기의 차이를 알 필요가 없습니다. – Dellirium

답변

1

비동기 문제인 경우 for 루프는 getData가 완료 될 때까지 기다리지 않으므로 페이지로드시 다운로드는 여전히 비어 있지만 콘솔에서 시도 할 때마다 다운로드가 완료되어 저장됩니다 다운로드 된 데이터 전역 변수이기 때문에 콘솔에서 실행할 때 이전 데이터 가져 오기에서 실제로 데이터를 처리하고있을 것입니다.

관련 문제