2014-07-05 2 views
0

초보자는 여기에 있습니다..getJSON이 루프에서 작동하지 않습니다.

는 다음 코드

$.getJSON('http://uifaces.com/api/v1/random', function(uifaces){ 
        var name=uifaces.username; 
        document.write(name)}); 

그것은 잘 실행을 가지고 있지만 내가 for 루프에 넣을 때마다 반복 다른 이름을 검색하기로되어 있지만,이 같은 일마다 출력합니다.

나는 몇 가지 조사를했고 두 가지 제안이있었습니다. 하나는 클로저를 포함하고 다른 하나는 대기열을 포함합니다. 하지만 둘 다 :

for (var i = 0; i < 5; i++) { 
(function(i){ 
$myQueue.queue(function(next){ 
      $.getJSON('http://uifaces.com/api/v1/random', function(uifaces){ 
        var name=uifaces.username; 
        document.write(name)});   
     next(); 
    }); 
})(i); 
} 
$myQueue.dequeue(); 

이 작품은 아닙니다. 그들은 단지 같은 이름을 출력합니다.

for(var i=0; i<5; i++){ 
(function(i){ 
$.getJSON('http://uifaces.com/api/v1/random', function(uifaces){ 
    var name=uifaces.username; 
    document.write(name) 
    } 
    }); 
})(i); 

}

나는이 문제를 해결하는 방법에 대한 다른 제안을 찾을 수 없습니다. 어떤 충고라도 크게 도움이 될 것입니다.

+1

이 경우 클로저 나 큐가 필요하지 않습니다.'document.write (name);'을 실행하여 각 루프에서 이름을 지우는 것입니다. – Holt

+0

각 호출마다 이름이 무작위로 지정되므로 여러 번 호출해야합니다. – user3236967

+0

홀트, 응답 해 주셔서 감사합니다. 그렇다면 그 이름이 한 번만 출력됩니다. 여기에 루프가 5 번 반복되면 동일한 이름의 5 개가 나에게 제공됩니다. – user3236967

답변

2

AJAX 요청은 jQuery에서 기본적으로 캐시됩니다 (스크립트 및 jsonp 요청 제외). 같은 리소스를 반복해서 요청할 경우에는 한 번만 가져오고 다른 한 번는 캐시 된 결과를 제공합니다. 그래서 같은 결과를 반복해서 가져옵니다.

for(var i=0; i<5; i++){ 

    $.ajax({ 
    url: 'http://uifaces.com/api/v1/random', 
    type: 'GET', 
    dataType: 'json', 
    cache: false, 
    success: function(uifaces){ 
     var name = uifaces.username; 
     document.write(name); 
    } 
    }); 

} 

참고 :이 현재의 당신을 위해 작동하는 것 같다 나는 단지, 테스트 목적으로 거기에 document.write 왼쪽이 꺼져 있어야 캐싱을 지정할 수 있도록

ajax 방법을 사용 상태. 일반적으로 당신은 그와 같이 document.write을 안정적으로 사용할 수 없습니다. 로드가 완료된 후 문서에 쓰면 현재 문서를 대체 할 새 문서가 열립니다.

+0

이 문제가 해결되었습니다. 도움을 많이 주셔서 감사합니다! 또한 document.write 팁을 주셔서 감사합니다. 나는 그것이 물건을 시험하는 가장 좋은 방법이었다라고 확신하지 않았다. 그러나 나는 그것에 관해 가야할 다른 방법을 모르고 있었다. – user3236967

0

이것은 동시성 문제입니다. getJSON을 사용하는 대신 getJSON이 기반으로하는 $.ajax function을 사용하십시오. 그런 다음 "async : false"매개 변수를 지정하면 서버가 루프의 각 반복마다 적절한 이름 값을 반환 할 때까지 기다립니다.

관련 문제