2017-01-26 10 views
0

どこに問題があるのか​​分かりません。私はここでいくつかの質問を読んだことがありますが、そのようなものは何もありません。 私は約束を返す関数を使用することはできません、私はちょうどすべての約束を1つの配列に入れ、 "$ .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'に渡すことができます)。いくらかのt彼は未来! – 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を3回)。このクロージャーには、反復ごとにローカル範囲に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>

EDITは - あなたはそれを見ることができるように、あなたが結果を得る、彼らはランダムな順序で解決していても、whenにコールバックを変更しました(つまり、aruments[0]は、常に最初に解決しなかったとしても、2になります)

+0

while/for/eachで$ .Deferredを作成するとどうすればいいですか? – Donovant

+0

@Donovantが正しい質問をすることは良いスタートです。質問が本当に 'b'なら' a'に質問してください。しかし、彼らがラインであろうとループであろうと、違いはありません。実行中の非同期作業の外でdeferrdを作成します。 – Jamiec

+0

質問更新済み – Donovant

関連する問題