2017-01-26 12 views
0

어디서 문제인지 이해할 수 없지만 여기 몇 가지 질문을 읽었지만 그와 같은 것은 없습니다. 약속을 반환하는 함수를 사용할 수 없습니다. 모든 약속을 한 배열에 넣고 "$ .when"함수에 전달해야합니다.지연된 모든 함수가 jQuery를 사용하여 해결 된 후에 만 ​​함수를 실행하는 방법은 무엇입니까?

var pr = []; 
var count = 3; 
while(count--){ 
    setTimeout(function(){ 
    var def = $.Deferred(); 
    pr.push(def.promise());  
    console.log('COUNT: '+count); def.resolve(count); 
    }, Math.random()*2000); 
} 

$.when.apply($, pr).done(function(d){ 
    console.log("LOG:",d); 
}); 

WHEN은 (는) 해당 시간까지 빈 상태이므로 분명히 작동하지 않습니다. 어떻게 정렬 할 수 있습니까?

+0

지연을 즉시 생성해야합니다 ('$ .when'에 전달할 수 있어야합니다). 어딘가에서 그는 미래! – Bergi

답변

2

실행 한 후에 만 ​​지연을 배열에 추가하는 것입니다. 요점은 당신이 배열을 앞두고 그들 모두가 일부 기능을 실행하면 그들이 원하는 것입니다. 당신이 기록거야없이

var defA = $.Deferred(); 
 
var pr = [defA.promise()]; 
 
var count = 3; 
 

 
var defB = $.Deferred(); 
 
pr.push(defB.promise());  
 
    
 
var defC = $.Deferred(); 
 
pr.push(defC.promise());  
 
    
 

 
setTimeout(function(){ 
 
    console.log('COUNT: '+count--); defB.resolve(count); 
 

 
}, Math.random()*2000); 
 

 
setTimeout(function(){ 
 
    console.log('COUNT: '+count--); defC.resolve(count); 
 
    defA.resolve(11011); 
 
}, Math.random()*2000); 
 

 

 
$.when.apply($, pr).done(function(d){ 
 
    console.log("LOG:",d); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
하여 업데이트

count 즉 비동기 작업이 완료 시간 (변경 한 바와 같이, 당신은, 또한 폐쇄를 사용해야합니다 count: 0 세 번). 이 클로저는 각 반복마다 로컬 범위에 def을 유지하는 깔끔한 부작용도 가지고 있습니다. 이 Q/A에서 더 많은 정보를 원하시면 : JavaScript closure inside loops – simple practical example

var pr = []; 
 
var count = 3; 
 
while(count--){ 
 
    
 
    (function(x){ 
 
     var def = $.Deferred(); 
 
     pr.push(def.promise());  
 
     setTimeout(function(){   
 
     
 
      console.log('COUNT: '+ x); 
 
      def.resolve(x); 
 
     }, Math.random()*2000); 
 
     
 
    })(count); 
 
} 
 

 
$.when.apply($, pr).done(function(){ 
 
    console.log("LOG:",arguments); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

편집이 - 당신은 그들이 무작위 순서로 해결하더라도, 그것을 볼 수 있도록 when에 콜백을 변경, 당신은 결과를 얻을 수 (즉, aruments[0]은 항상 2이 될 것입니다.)

+0

while/for/each에서 $ .Deferred를 만들면 어떻게 할 수 있습니까? – Donovant

+0

@Donovant가 올바른 질문을하는 것이 좋은 출발입니다. 질문이 정말로'b'이면'a'라고 물어 보지 마십시오. 그러나 그들이 라인에 있든 루프에 있든간에 차이는 없어야합니다. 수행중인 비동기 작업 외부에서 deferrd를 만듭니다. – Jamiec

+0

질문 업데이트 – Donovant