Hatena::ブログ(Diary)

ドラゴンクエスト このページをアンテナに追加 RSSフィード

2008-01-18

JavaScriptの非同期処理を快適にしてくれる JSDeferred ライブラリ

http://subtech.g.hatena.ne.jp/cho45/20080118/1200615245

うひょー!

初めてトラックバックを貰ったよー!


JSDeferred だとこんな感じかなぁ

じぇーえすでふぇっれど?

聞いたことないなぁ

Google先生に聞いてみよう。(やる夫略)


JSDeferred による非同期処理


こりゃすげぇ!!


setInterval だの XMLHttpRequest だのの非同期処理が終わるまで待っててくれるようになるんだ!これはすごい。Greasemonkeyがもっと楽しくなる予感がモリモリする!あのパワーポイントみたいな画面もすごい。ドメインがgihyo.jpだ。ギヒョー!!

早速使ってみよう。

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);
});

});

エラー

f:id:drgqst:20080118213001g:image


あれ? おかしいな・・・

あ・・・そういえば、はじめに何か関数を呼べって書いてたような気がするお


もう一度頭から読み直してみよう。。。

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);
});

});

エラー

f:id:drgqst:20080118223408g:image


あれ・・・ おかしいなぁ。あ、「xhttp」がないのか。


ん・・・ 待てよ・・・

一つ目の「next」で発生した例外が、一番最後の「error」まで伝播してるじゃないか。

おぉー。なんかすごい。


再々チャレンジ

wikiをちゃんと読んでみよう。

JSDeferred - CodeRepos


ううむ・・・ 英語がいっぱいだ・・・ がんばれ俺

f:id:drgqst:20080118231352g:image

ここで「Download」の文字を見つけた瞬間にもう思考停止して、すぐにダウンロードしてしまったのですが

もうちょっと↓にスクロールすると、、、

f:id:drgqst:20080118231526g:image

!!!!!!!!!!!

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 を
   貼り付けた
*/

ドキドキ・・・


f:id:drgqst:20080118235110g:image

いやっほう!

Twitterから画像を持ってくることに成功しました。バンザーイ

まとめ

  • JSDeferred は非同期処理を優しくしてくれるライブラリ
  • 非同期処理のtry{}catch{}もまとめてくれる。
  • もうXMLHttpRequestだって怖くない。
  • ぐりもんもあるでよ(←超重要)

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