2017-12-26 51 views
-1

그래서 내가하고있는 일은 json 파일에서 값을 가져와 무작위로 하나를 선택할 수 있도록 html 파일에 표시되도록 배열로 푸시하는 것입니다. 제가하는 데 문제는 배열이 비어있을 때 비어 있습니다 ... JavaScript

var quotes = []; 
var authors = []; 

function loadJSON(callback) { 

    var xobj = new XMLHttpRequest(); 
    xobj.overrideMimeType("application/json"); 
    xobj.open('GET', 'quotes.json', true); 
    xobj.onreadystatechange = function() { 
     if (xobj.readyState == 4 && xobj.status == "200") { 
     // Required use of an anonymous callback as .open will NOT return a value but simply returns undefined in asynchronous mode 
      callback(xobj.responseText); 
     } 
    }; 
    xobj.send(null); 
} 

function init() { 
    loadJSON(function(response) { 
     // Parse JSON string into object 
     var data = JSON.parse(response); 
     for(var i in data){ 
      var key = i; 
      var val = data[i]; 
      quotes.push(key); 
      authors.push(val); 
     } 
    }); 
} 

init(); 

var index = Math.floor(Math.random()* (quotes.length + 1)); 

document.getElementById("p1").innerHTML = "<span class=\"quotes\">&ldquo;</span>" + quotes[index] + "<span class=\"quotes\">&rdquo;</span>" + "<span id=\"author\">" + " – " + authors[index] + "</span"; 

그래서 내 init 함수에서 키와 배열에 발하지만 밀어 ... 뭔가 배열의 경우에도 비어있는 것처럼, 그것을 처리하는 것입니다 그것은 비어있는 것처럼 취급 ... 나는 이것이 JSON에서 매우 새로운 간단한 질문이지만 미안하다. 감사합니다

+1

또한 마지막 '에는'>'이 누락되었습니다. – Xufox

+0

@Xufox ok 감사합니다. 그냥 복사 붙여 넣기 오류였습니다. –

+0

init 함수 안에 마지막 두 줄을 넣으십시오. – Ayudh

답변

0

init 내에서 실제로 작업이 완료되기 전에 코드의 마지막 2 줄 (init 함수를 호출 한 후)을 실행하고 있다는 것이 문제라고 생각합니다.

즉, loadJSON처럼 콜백을 init으로 전달한 다음 마지막 두 줄을 실행합니다.

+0

감사합니다 –

0

Xufox에서 지적한대로, 비동기 코드를 처리하고 있습니다. getElementById가 데이터 요청을 실행하면 아직 완료되지 않았으므로 innerHTML에 대한 빈 배열로 끝납니다. 당신이 바벨, for of를 사용하는 경우

이이 질문과 관련,하지만 much as you can when dealing with arraysfor ... in를 사용하는 것이 무효되지는 그것을 위해 오래된 학교 for을 선호하거나.

+0

나는 그것을 사용하여 무효화하려고합니다 감사합니다 –