2014
12
02
12
02
JavaScript: 非同期処理をfor loopとjQuery.Deferredで直列処理する(Deferred with for loop)
前回にjQuery.Deferredを使って複数の非同期処理をそれぞれの終了を待って順番に行った。
jQuery.Deferredで非同期処理を書く
配列filesに入れられたファイルを関数showImageで順番に処理するようにとコールバックがごちゃごちゃと回されるように書かれていたところを、わりと素直なfor文で置き換えることができた。
コールバックの置き換えは済んだが、とりあえず動くものを作ろうと単純な使い方を真似しようとした結果、実行する式を文字列で作っておいてevalで実行する形を取った。Deferredオブジェクトをforループごとにthenでつなぐのはどうやればいいかわからかったので。そこらがもうちょい調べて試行してevalを取っ払うことができた。
おまけサンプル
http://jsfiddle.net/hiroaki/v2ok8rhd/1/
jQuery.Deferredで非同期処理を書く
配列filesに入れられたファイルを関数showImageで順番に処理するようにとコールバックがごちゃごちゃと回されるように書かれていたところを、わりと素直なfor文で置き換えることができた。
if (files.length) {
var str = "showImage(files[0])()";
for (var i = 1, f; f = files[i]; i++) {
str += ".then(showImage(f))";
}
eval(str);
}
コールバックの置き換えは済んだが、とりあえず動くものを作ろうと単純な使い方を真似しようとした結果、実行する式を文字列で作っておいてevalで実行する形を取った。Deferredオブジェクトをforループごとにthenでつなぐのはどうやればいいかわからかったので。そこらがもうちょい調べて試行してevalを取っ払うことができた。
var d = (new $.Deferred()).resolve();
for (var i = 0, f; f = files[i]; i++) {
d = d.then(showImage(f));
}
おまけサンプル
http://jsfiddle.net/hiroaki/v2ok8rhd/1/