これは結構使えるのでメモ。
/** * 非同期ループ * * array * fn * onprogress * onend */ function asyncEach(array, fn, progress, onend) { var i = 0, maxBurnTime = 100, // ms to run before yielding to user agent onendFn = onend || progress, progressFn = (onendFn === progress ? null : progress); function iter() { var startTime = Date.now(); while(i < array.length) { fn.call(array, array[i], i++); if(Date.now() - startTime > maxBurnTime) { if(progressFn) progressFn(i, array.length); return window.setTimeout(iter, 0); } } if(progressFn) progressFn(i, array.length); if(onendFn) onendFn(null, array); } window.setTimeout(iter, 0); } // // テスト実行 // var arr = [ 'one', 'two', 'three' ]; asyncEach(arr, // function function(item, i){ console.log('start' + i); // ランダムにスリープ後、ログ出力 setTimeout(function(){ console.log('item' + i + '=' + item); }, Math.floor(Math.random() * 100)); }, // onprogress function(loaded, total){ console.log(loaded + '/' + total); }, // onend function(err, val){ console.log('val=' + val + ', err=' + err); });
これを実行すると、
start0 start1 start2 3/3 val=one,two,three, err=null item1=two item0=one item2=three
こんなふうにログ出力されます。
第二引数の関数が非同期的に実行されているのが分かりますね。
参考にさせてもらったサイト。
async forEach in JavaScript
0 件のコメント:
コメントを投稿