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
을 호출하면 왜 생성되지 않습니까?
작성되었습니다 .... 그냥 비동기 .... 그리고'promises'와'.then'을 사용하지 않기 때문에'getData()'가 실제로 데이터를 얻기 전에 코드가 계속됩니다. 나중에 (콘솔을 열고 타입을 입력 할 때까지) 작동한다. – Dellirium
Ahhh ... 나는 이것이 문제가 될 수 있다는 것을 몰랐다. 나는 프로그래밍에 익숙하지 않았기 때문에'getData()'이 기본적으로 완료되기 전에'promises'와'.then'을 살펴볼 것입니다. 감사합니다. – IsenfireLDC
'getData'가 완료되었지만,'getData' 그 함수의 결과는'downloads' 변수에 존재하지 않습니다. 즉, HTTP 요청을 처리하는 데 사용되는 이벤트 처리기 인 onreadystatechange는 이름이 읽기 전이 변경되면 해방을 말합니다. 'downloads' 변수에 액세스하려고 시도합니다. 실제로 액세스하려고 시도하기 전에는 실제로 실행되지 않습니다.이 때문에 동기화와 비동기의 차이를 알 필요가 없습니다. – Dellirium