###前提
今、JavaScriptの非同期処理について学んでいます。
for文と非同期処理をうまく書く方法を探していたところ、とあるウェブサイトで以下のようなコードを見つけました。
(参考URL:javascriptで非同期処理をfor文で回したい。)
しかし、内容が理解出来ません。
初心者なので、当たり前のことを理解していないとんちんかんな質問になっているかもしれませんが、どうぞよろしくお願いします。
例えば、次のような非同期処理を上から順に行って行きたい時(a,b,c,dを順番に表示したい)、下のように書き換えればa,b,c,dの順に表示されるようになります。
JavaScript
1setTimeout( () =>{console.log('a');},4000); 2setTimeout( () =>{console.log('b');},3000); 3setTimeout( () =>{console.log('c');},2000); 4setTimeout( () =>{console.log('d');},1000);
JavaScript
1(function(){ 2var arr = ['a','b','c','d']; 3var d = Promise.resolve(); 4for(var i=0;i<arr.length;i++){ 5 d = d.then( function(i){ 6 return new Promise((resolve,reject)=>{ 7 setTimeout(()=>{ 8 console.log(arr[i]); 9 resolve(); 10 } 11 ,(4-i)*1000) 12 }) 13 }.bind(null,i)) 14} 15})();
###疑問点
①Promise.resolve()は、then()メソッドを呼び出すためにPromiseオブジェクトを返す役割を果たしていると解釈してよいのでしょうか。
②forを展開した時にどういう記述になるのか分かりません。あるいは、forが進むごとにどのような処理が具体的に行われているのか分かりません。d = d.then(以下略)とすることでiのカウントが進むごとにthenチェーンがつながるのかな程度の想像で理解が止まってしまいます(そもそもその想像自体がまちがっているかもしれませんが)。
③即時関数への引数をbindで指定していますが、なぜそうする必要があるのかが分かりません。実際、.bind(null, i)の部分を(i)に変えたところ、d,c,b,aの順に表示されてしまいました。コールバック関数の引数を固定する場合bindを使うようですが、そもそもその理由が理解できていません。bindの基本的な使い方としてthisの対象を固定するというのは理解したのですが、引数について分からないままです……。
以上の点、お答え頂ける優しい方がいたらどうかよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー