2016-07-19 2 views
0

StackOverflow에 대한 훌륭한 참고 자료에 따르면 $.get 요청이 완료된 후에 $.when()을 사용하여 일부 이벤트를 트리거하는 것으로 알고 있습니다.AJAX .get 호출에 변수 할당하기

그러나 $.get이 for 루프 안에 있다면 어떻게 될까요?

var d = Array(5); 
for (i = 0; i < 5; i++) { 
    d[0] = $.get()... 
} 

$.when(d).done(function(a){ 
... 
} 

을하지만이 작동하지 않습니다

for (i = 0; i < 5; i++) { 
    $.get()... 
} 

$.when().done(function(a){ 
} 

그래서 나는 배열에 각 변수를 할당 할 거라 생각 했어요. 제안 할 대안이 있습니까? 아니면 내가 옳은 것을하기 위해 뭔가를하고 있는가?

답변

1

하지 끔찍한 분명 당신이 요구하는지,하지만 당신은 모든 요청을 집계 할 경우 모두 완료되면 단일 콜백을 실행하십시오. 다음과 같이하십시오.

하나 개 이상의 $.get 요청이 실패했기 때문에 해고되지

var requests = []; 
for(var i = 0;i < 5;i++) { 
    requests.push($.get(...)); 
} 

$.when.apply(null,requests).then(function() { }); 

.then 경우 요청의 배열과 $.when210

사용 apply, 그것은이다. 이것을보십시오 :

$.when 
    .apply(null,requests) 
    .then(
    function() { console.log('success'); }, 
    function() { console.log('at least one failed'); } 
); 
+0

나는 이것을 시도했다. 'requests.push'를 넣으면 모든'$ .get' 요청이 실행됩니다. 그래서 모든 요청은'$ .when'에 도착할 때까지 이루어 지므로'.then'은 절대 실행되지 않습니다. – Rio

+0

@ 리오 - 약속이 작동하는 방식이 아닙니다. '.then'은 모든 약속이 이미 해결되었거나 미래의 어떤 시점에서 해결 될 것인지에 관계없이 해결됩니다. '.then'이 결코 발생하지 않는다면, 아마도 그것들 모두가 해결되지 않았기 때문일 것입니다 (아마 하나 또는 그 이상이 실패했을 것입니다). 또한, 그들은 물론 당신이 그들을 만들 자마자 그들의 요구를합니다. 당신은 그들이 언제 그 요청을하기를 원합니까? – Adam

+0

네 말이 맞아. 그 중 하나가 실패했습니다. 실패를 피하고 계속해서 실패 할 수있는 방법이 있습니까? – Rio

0

for 루프 내에 done()을 넣을 수 있습니까? 단순히

for (i = 0; i < 5; i++) { 
    $.get().when().done(function(a){ 
    ... 
    } 
} 

또는 어쩌면 더 :

for (i = 0; i < 5; i++) { 
    $.get(url, function(a){ 
     ... 
    }); 
} 

이 예에서는 'A'는 각각의 콜백 인스턴스의 고유 것이다. 의견에 따라

UPDATE : 비동기에 대한

var accumulate; //outside the loop 

for (i = 0; i < 5; i++) { 
    $.get(url, function(a){ 
     accumulate += a; 
    }); 
} 

UPDATEhttp://caolan.github.io/async/docs.html#.parallel

var myTasks = []; 
for (i = 0; i < 5; i++) { 
    myTasks.push(function(callback) 
     { 
     $.get(url, function(a){ 
      callback(null, a); 
     }); 
     } 
} 
async.parallel(myTasks, function(err, resultsArray) 
{ 
    // all done 
    // aggregate the array as you wish. 
}); 
+0

확실히 아닙니다; 모든 응답 (모든 함수 (a)가 각 $ .get에 있음)의 데이터를 집계하는 무언가가 필요합니다. – Rio

+0

예를 들어 업데이트 된 답변보기 aggregation. – Aaron

+0

for 루프 이후에'accumulate'를 검색하려고하면 $ .get 요청에 오랜 시간이 걸리므로'accumulate'는 비어 있습니다. – Rio

관련 문제