自由に生きるために奔走する毎日

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

jQuery.Deferredを試してみた

爆速でわかるjQuery.Deferred超入門
http://techblog.yahoo.co.jp/programming/jquery-deferred/

ホッテントリで見かけた記事。
ちょうど非同期処理の処理順を毎回同じにできないかと考えていたところなので早速導入してみた。

具体的には、先日作ったPSO2ショップ検索補助App。本体ではなく「wikiからアイテムデータを回収してくるツール」の方。31個の(Yahoo !Pipesの)pipeからRSSフィードを取得しているのだが、当然ながらリクエストを出した順に結果が返るわけではない。FileSystemAPIは出力した順でファイル名(00000000から始まる連番)が決まるので、取得完了コールバックからファイル出力すると毎回ファイル名が変わってしまう。これを固定したい。

もちろん結果をプールしておいて全部揃ってから出力すれば固定できるのだけど、大きく構成を変るのが面倒なので放置しておいた。しかしDeferredを導入すれば、わずかな変更で実現できそうだ。

変更前
$.each(categorylist, function(idx, ctg_lst) {
var url_unt = 'http://pipes.yahoo.com/pipes/pipe.run?'
+ ctg_lst.pipe_id + '&_render=rss';
$.getFeed({ url:url_unt,
success: getFeedCallbackJQ });
});
num_loaded = 0;
num_loading = categorylist.length;
var objid = setInterval(function() {
getNextPage(objid);
}, CHECK_INTV);
こんな感じ。終了チェック(リクエストした数を保持しておいて定期的に取得数を確認)もダサいので止めたい。

変更後
var prms = null;
$.each(categorylist, function(idx, ctg_lst) {
if (prms == null) {
prms = getFeedPromise(ctg_lst.pipe_id);
} else {
prms = prms.then(function() {
return getFeedPromise(ctg_lst.pipe_id)
});
}
});
if (prms != null) {
prms.then(getNextPage);
}
function getFeedPromise(pipe_id) {
var dfr = new $.Deferred;
var url_unt = 'http://pipes.yahoo.com/pipes/pipe.run?'
+ ctg_lst.pipe_id + '&_render=rss';
$.getFeed({ url:url_unt,
success: function(feed) {
getFeedCallbackJQ(feed, dfr);
}
});
return dfr.promise();
}
リクエスト部分を関数化してPromiseオブジェクトを返すようにした上で、リクエストを順番にthenでつないで終端に終了トリガーをつなぐよう変更しただけ。

リクエストが並列→直列になるので実行時間は長くなるけれども、ファイル名が固定化される方を優先した。自分で使うだけのツールだし。手をかけて実装し直す機会があれば、リクエストをwhenでつないで終了待ち部分だけ綺麗にし、取得完了コールバックを"出力せずにプールだけする"よう変え、出力は終了トリガーでまとめてやる形にするかな。

なお、変更自体はわずかだったものの一箇所だけハマった。元記事のサンプルどおりに実装してもthenで繋いだ非同期処理が同時に実行されてしまうという問題で。原因は元記事に

なお、jQueryのバージョンは記事執筆時点の最新である、1.9.1を想定しています。

とあるのに、1.7.2でやってたせい。1.8.0以上でないとthenは順次処理してくれないので注意(常識なのかな...)

にほんブログ村 IT技術ブログへ
スポンサーサイト
コメント
コメントの投稿
【Font & Icon】
管理者にだけ表示を許可する
ランキング
ブログランキング・にほんブログ村へ
PR広告
FC2動画
プロフィール

ykhmfst

Author:ykhmfst
プログラムとその周辺技術、Web技術、ゲーム、4コマ漫画、サッカーと横浜FC、そして自由のために奔走する日々を徒然と


最新記事
過去の書庫
メールフォーム

名前:
メール:
件名:
本文:

おすすめ
J2白書〈2013〉
J2白書〈2013〉
J’s GOAL J2ライター班
東邦出版 2014-01-23
カテゴリ
カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
検索フォーム
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。