JSDeferred使ってみた
// ==UserScript== // @name 超テスト // @namespace http://d.hatena.ne.jp/drgqst/ // @description 超スーパーグレイトウルトラテスト // @include http://www.google.co.jp/* // ==/UserScript== (function(){ /* ここに JSDeferred のコードを貼り付けた */ function parseJSON (d) { // unsafe return eval("("+d.responseText+")"); } next(function () { return xhttp.get("http://twitter.com/statuses/public_timeline.json").next(parseJSON); }). next(function (d) { var id = d[0].user.screen_name; GM_log(id); return xhttp.get("http://twitter.com/users/show/" + id + ".json").next(parseJSON); }). next(function (d) { GM_log(uneval(d)); }). error(function (e) { alert(e); }); });
あれ? おかしいな・・・
あ・・・そういえば、はじめに何か関数を呼べって書いてたような気がするお
もう一度頭から読み直してみよう。。。
JSDeferred による非同期処理
ピコーン!
そうだ!思い出した。
Deferred.define();
デファインを呼ぶんだった。デファイン。1日使い捨てコンタクトレンズ。ワンデー アキュビュー デファイン。
再チャレンジ
// ==UserScript== // @name 超テスト // @namespace http://d.hatena.ne.jp/drgqst/ // @description 超スーパーグレイトウルトラテスト // @include http://www.google.co.jp/* // ==/UserScript== (function(){ /* ここに JSDeferred のコードを貼り付けた */ Deferred.define(); // ← ここに追加した function parseJSON (d) { // unsafe return eval("("+d.responseText+")"); } next(function () { return xhttp.get("http://twitter.com/statuses/public_timeline.json").next(parseJSON); }). next(function (d) { var id = d[0].user.screen_name; GM_log(id); return xhttp.get("http://twitter.com/users/show/" + id + ".json").next(parseJSON); }). next(function (d) { GM_log(uneval(d)); }). error(function (e) { alert(e); }); });
あれ・・・ おかしいなぁ。あ、「xhttp」がないのか。
ん・・・ 待てよ・・・
一つ目の「next」で発生した例外が、一番最後の「error」まで伝播してるじゃないか。
おぉー。なんかすごい。
再々チャレンジ
wikiをちゃんと読んでみよう。
JSDeferred - CodeRepos
ううむ・・・ 英語がいっぱいだ・・・ がんばれ俺
ここで「Download」の文字を見つけた瞬間にもう思考停止して、すぐにダウンロードしてしまったのですが
もうちょっと↓にスクロールすると、、、
!!!!!!!!!!!
Greasemonkeyで使うためのコードが用意されてるじゃないか!
最初からこれを使わせてもらえばよかったんだ。俺が今までやってたのはなんだったんだ。フハハハハ!!見ろ、俺がゴミのようだ!!
なんで最後まで読まないんだ。俺のバカ!アカイライ!
再々チャレンジ
// ==UserScript== // @name 超テスト // @namespace http://d.hatena.ne.jp/drgqst/ // @description 超スーパーグレイトウルトラテスト // @include http://www.google.co.jp/* // ==/UserScript== with (D()) { function parseJSON (d) { // unsafe return eval("("+d.responseText+")"); } next(function () { return xhttp.get("http://twitter.com/statuses/public_timeline.json").next(parseJSON); }). next(function (d) { var id = d[0].user.screen_name; return xhttp.get("http://twitter.com/users/show/" + id + ".json").next(parseJSON); }). next(function (d) { var img = document.createElement( "img" ); img.src = d.profile_image_url; document.body.appendChild( img ); }). error(function (e) { alert(e); }); } /* ここに http://svn.coderepos.org/share/lang/javascript/jsdeferred/trunk/jsdeferred.userscript.js を 貼り付けた */
ドキドキ・・・
いやっほう!
Twitterから画像を持ってくることに成功しました。バンザーイ
まとめ
- JSDeferred は非同期処理を優しくしてくれるライブラリ。
- 非同期処理のtry{}catch{}もまとめてくれる。
- もうXMLHttpRequestだって怖くない。
- ぐりもんもあるでよ(←超重要)
みんなも使ってみるといいよ!