2010-03-01 2 views
1

를 참조 페이지에 존재 확인 할 수 없습니다. 여기에서 문제는 피드에서 나는 지난 해 (인수 요청으로부터 310 억 밀리 초) 내에있는 기준을 충족시키는 항목 10 개를 선택해야하며 변수를 사용하여 피드에서 원하는 결과의 수를 지정해야합니다. 'maxRows'는 URL에 삽입됩니다. 기능은 다음과 같습니다 ...는 그 요소가 나는 분명히 내가 JSON 피드에서 정보를 잡기 위해 jQuery를 사용하는 함수를 사용하고 그것을이

function topTen(rows) { 
    $.getJSON("http://ws.geonames.org/earthquakesJSON?north=90&south=-90&east=-180&west=180&maxRows=" + rows, 
     function(json) { 
      var topTen = new Array(); 
      var now = new Date(); 
      var i; 
      for(i = 0; i < json.earthquakes.length; i++) 
      { 
       var time = json.earthquakes[i].datetime; 
       var then = new Date(time.replace(" ", "T")); 
       if(now - then < 31536000000) { topTen.push(json.earthquakes[i].eqid); } 
      } 
      if(topTen.length >= 10) 
      { 
       var html = "The Top Ten Earthquakes Of The Past Year<ol>"; 
       for(i = 1; i <= 10; i++) 
       { 
        html += "<li id='number" + i + "' >" + topTen[i - 1] + "</li>"; 
       } 
       html += "</ol>"; 
       $('#top_ten').html(html); 
      } 
     }); 
} 

이제 문제는 첫 번째 요청에서 내 기준을 충족하는 10 가지 결과를 얻지 못할 가능성이 높습니다. 따라서 이것을 막으려면 다른 기준이 충족 될 때까지 함수를 루프에 넣으려고합니다. 내가

var rows = 10; 
    do{ 
     topTen(rows); 
     rows += 10; 
    while(!document.getElementById("number10")) 
문제는 다음 그러나이된다

뭔가를 시도 할 경우, 이것은 항상 실제 작업을 수행하는 기능이 결합 아니라는 것을 의미하는해서 getJSON 기능 (혹은 콜백)이 비동기이기 때문에 실패하는 바람이 루프의 라인 단위 타이밍에 의해 루프 자체가 실제로 실제로 끝나고 루프 조건이 충족되기 전에 많은, 많은, 많은 시간 실행됩니다. 그래서 지금 나는 그것이 같은 소리와 밀리 초 걸립니다 그냥 뭐 기본적으로이

topTen(rows); 
    rows += 10; 
    pause(1000); 
    topTen(rows); 
    rows += 10; 
    pause(1000); 
    topTen(rows); 
    rows += 10; 
    pause(1000); 
    if(document.getElementById("number10")) 
     alert("There's 10!"); 
    else 
     alert("There's not 10!"); 

일시 정지 같은 것을가는 또 다른 방법을 고안하기 위해 노력하고있어. 복사 한 후 붙여 넣은 루프의 초기 날짜 개체와 나중 날짜 개체의 간단한 비교. 이것은 서로의 직후에 기능이 발사되는 것을 막기 위해 작동하지만, 문제는 if 조건이 결코 충족되지 않는다는 것입니다. 나는 그것이 무엇인지는 모르지만 멈출 수있는 시간이 아무리 많아도 getElementById 함수는 Firebug에서 매우 명확하게 볼 수 있지만 'number10'의 ID를 가진 요소를 찾지 못하는 것 같습니다.

때문에 나는이 문제를 여러 번 브라우저를 충돌 한 적이 그리고 난 심각하게 PO'd을 얻고 그것의 아픈. 누구든지이 문제에 대한 해결책을 찾거나 더 쉽고 더 우아한 해결책을 제시 할 수 있다면 영원히 감사 할 것입니다.

추신 : 전 전역 변수와 재귀를 사용하여 콜백 함수 내부에서 topTen()을 호출하고 더 큰 'rows'변수를 보내려고했지만 콜백 함수처럼 보이지 않으므로 작동하지 않습니다. 내 자신의 자바 스크립트의 나머지 90 %가 존재하지 않는 작은 세계에 포함되어 있습니다.

답변

1
당신이 길을 잘못하고있는

...

당신은 하나의 호출을 다시 호출하기 전에 반환 할 때까지 기다릴 필요가있다. 운 좋게도, 당신은 이미 리턴 된 함수를 가지고 있습니다. 그래서 그 기능에 대한 간단한 변화와 당신이 완료되었습니다.

var topTenList = new Array(); 


function topTen(rows) { 
    $.getJSON("http://ws.geonames.org/earthquakesJSON?north=90&south=-90&east=-180&west=180&maxRows=" + rows, 
     function(json) { 
      var now = new Date(); 
      var i; 
      for(i = 0; i < json.earthquakes.length; i++) 
      { 
       var time = json.earthquakes[i].datetime; 
       var then = new Date(time.replace(" ", "T")); 
       if(now - then < 31536000000) { topTenList.push(json.earthquakes[i].eqid); } 
      } 
      if (topTenList.length < 10) 
      { 
       topTen(rows+10); 
       return; 
      } 
      else 
      { 
       var html = "The Top Ten Earthquakes Of The Past Year<ol>"; 
       for(i = 1; i <= 10; i++) 
       { 
        html += "<li id='number" + i + "' >" + topTenList[i - 1] + "</li>"; 
       } 
       html += "</ol>"; 
       $('#top_ten').html(html); 
      } 
     }); 
} 
+0

음 ... 나는 이해할 것이라고 생각하지 않습니다. –

+0

Mathias : 코드 – Hogan

+0

을 추가했습니다. 작동하지 않습니다. Firebug의 오류는 topTen() 함수가 존재하지 않는다고 말합니다. –

관련 문제