###実現したいこと
$.when
でループを使いたいです。
###該当のソースコード
現状のfunc1()
になります。クリックしたら、
➀get( 'A' )
とget( 'B' )
を同時に実行する。
➁その戻り値を取得したら順次、新しい処理を実行する。
という処理です。
実現したいことはこの$.when()
の中のget()
をループにすることです。
尚、理由はget()
の引数が不定数の配列だからです。
html
1<button id="func1">func1() を実行</button>
js
1// get( 'A' )とget( 'B' )を同時に実行しつつ、検索結果は順次表示できる 2$('#func1').on('click',function(){ 3 func1(); 4}); 5 6function func1() { 7 $.when( 8 get( 'A' ).done( function( A ) { 9 console.log( A ); 10 }), 11 get( 'B' ).done( function( B ) { 12 console.log( B ); 13 }) 14 ).done( function( A, B ) { 15 console.log( A+'を使って新しい処理を実行' ); 16 console.log( B+'を使って新しい処理を実行' ); 17 }); 18} 19 20function get( arg ){ 21 console.log('getA( '+arg+' )を実行'); 22 var delay = arg=='A' ? 500 : 1000; 23 var deferred = new $.Deferred; 24 setTimeout( function() { 25 var data = arg + 'の検索結果'; 26 deferred.resolve( data ); 27 }, delay); 28 return deferred.promise(); 29}
###試したこと
通常のforEach
を使うと以下func2()
になるかと思いました。
理想はfunc1()
と同様に、
Aの検索結果
Bの検索結果
↓
Aの検索結果を使って新しい処理を実行
Bの検索結果を使って新しい処理を実行
という順序で表示することです。
しかしその順序が逆になり、さらに.done( function( A, B )
が戻らずundefinedを使って新しい処理を実行
のように表示されてしまいます。
html
1<button id="func2">func2() を実行</button>
js
1// func1()と同様の処理について、arrを使ってループで実現したい 2$('#func2').on('click',function(){ 3 var arr = ['A','B']; // arrは不定で['A','B','C']などもありえる 4 func2( arr ); 5}); 6 7function func2( arr ){ 8 $.when( 9 loop( arr ) 10 ).done( function( A, B ) { 11 console.log( A+'を使って新しい処理を実行' ); 12 console.log( B+'を使って新しい処理を実行' ); 13 }); 14} 15function loop( arr ){ 16 arr.forEach( x => { 17 get( x ).done( function( x ) { 18 console.log( x ); 19 }); 20 }); 21}
順序が逆になるということは、loop()
の方でも$.Deferred
が必要か?と思ったのですが、その場合resolve()
で戻す値をどうすればいいのかとわからなくなり、結局質問を投稿させていただく運びとなりました。
有効な方法をご存じの方いらっしゃいましたら宜しくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/03 05:23 編集
2020/01/03 05:30 編集
2020/01/03 05:49
2020/01/03 05:58
2020/01/03 06:04
2020/01/03 06:07
2020/01/03 08:19
2020/01/03 08:44