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だって怖くない。
  • ぐりもんもあるでよ(←超重要)

みんなも使ってみるといいよ!