SlideShare a Scribd company logo
1 of 20
Download to read offline
jQuery.Deferred
Kotaro Kawashima / Engraphia corp.
$.Deferredってややこしい
そんなことないよ
じつはすげぇしんぷるなんよ
Deferred is Simple
1. インスタンス作って
2. done() でコールバック関数設定して
3. resolve() 呼ぶと
4. 2.のコールバック関数が実行される
だけ
もっと複雑な処理向けに
知っておくべき機能・知識はあるけど
今は知らないふりをしろ
一番無意味でシンプルな
Deferred
var d = new $.Deferred();
d.done(function(){
console.log(“complete”);
});
d.resolve();
何をやっているのか
• Deferredインスタンスはコールバック関数を保存でき
る
• done(), fail(), then(), always()
• Deferredインスタンスにresolve()命令をすると、
done()で保存した関数を実行する
• resolve() -> done(), then(first_argument), always()
• reject() -> fail(), then(…,second_argument), always()
シンプルなDeferred実用例
var d = new $.Deferred();
d.done(function(arg){
console.log(“result: “, arg); // -> result: rslt
});
setTimeout(function(){
var result = “rslt”;
d.resolve(result);
}, 10000); // 10秒かかる複雑なタスクの代わり
シンプルなDeferred実用例
• d.resolve() を非同期処理の完了後に呼んでる
• resolve / reject に引数を渡すと、コールバック関数の引数として処理できる
• コールバック関数は10秒後(非同期処理後)
に実行される
→ 非同期処理の完了を待っての処理が書ける
複雑なDeferred実用例
function longTimeFunc(){
var d = new $.Deferred();
// 10秒かかる複雑なタスクの代わり
setTimeout(function(){
var result = “rslt”;
d.resolve(result);
}, 10000);
return d;
}
function main(){
var d2 = longTimeFunc();
d2.done(function(arg){
console.log(“complete”, arg);

// -> result: rslt
});
}
何をやっているのか
• やってることは同じ
• 非同期処理部分を function 化しただけ
• いきなり複雑になる!
• 全部JavaScriptのせいだ!
$.Deferredの複雑な便利機能
$.Promise
• d.promise() で取得
• deferredからresolve/reject機能を省いたもの
• つまり状態変化をさせられないようにする
• functionの返り値にしておくと、関数の外で

勝手にresolve/rejectされなくて済むようになる
複雑なDeferred実用例
function longTimeFunc(){
var d = new $.Deferred();
// 10秒かかる複雑なタスクの代わり
setTimeout(function(){
var result = “rslt”;
d.resolve(result);
}, 10000);
return d.promise();
}
function main(){
var p = longTimeFunc();
p.done(function(arg){
console.log(“complete”, arg);

// -> result: rslt
});
}
$.when()
• 複数あるpromiseをまとめる
• 非同期処理AとBとの両方が終わったら、done
を実行したい!
• $.when(promiseOfA, promiseOfB)

.done(function(){…});
d.then(donefunc, failfunc)
• done()とfail()とを一気に指定
• 普段は、返り値としてdeferred/promise(以下d/p)そのものが返ってくる
• d.then(asyncFuncA).then(asyncFuncB).then(funcC);
• var dFromA = d.then(asyncFuncA);
• var dFromB = dFromA.then(asyncFuncB);
• dFromB.then(funcC);
• d = dFromA = dFromB
• asyncFuncA, asyncFuncB, funcC は同時実行される
d.then(donefunc, failfunc)
• dのあと、非同期処理Aが終わったらB、それが終わったらC、という処理もかける!
• d.then(asyncFuncA).then(asyncFuncB).then(funcC);
• 条件:処理AおよびBが、そのfunctionの中で新しくDeferredを作成し、d/pを返
している
• このときのd.then()の返り値は、処理A/Bが返してきたd/pになる
• var dFromA = d.then(asyncFuncA);
• var dFromB = dFromA.then(asyncFuncB);
• dFromB.then(funcC);
おまけ
非同期処理の個数が不定
• ウェブサービスのユーザー情報を、1ユーザー
1ajaxで取得
• ユーザー数は取得できるが、ユーザー数が変
動するので$.when()に渡せない!
API設計からやり直せ
非同期処理の個数が不定
var userIds = getUserIds(); // ユーザーIDの配列

var ps = [];

for(var i = 0; i <userIds; i++){

var p = $.ajax(…); //$.ajaxはpromiseを返す

ps.push( p );

}

$.when.apply(this, ps).done(function(){

…

});

More Related Content

What's hot

Erlangのマルチプロセスを触ってみた
Erlangのマルチプロセスを触ってみたErlangのマルチプロセスを触ってみた
Erlangのマルチプロセスを触ってみたYoichi Toyota
 
わかるコードを書くために For writing clean code
わかるコードを書くために For writing clean codeわかるコードを書くために For writing clean code
わかるコードを書くために For writing clean codeEyes, JAPAN
 
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜Kenta USAMI
 
OpenFlowコントローラ開発支援ツールの提案
OpenFlowコントローラ開発支援ツールの提案OpenFlowコントローラ開発支援ツールの提案
OpenFlowコントローラ開発支援ツールの提案Yutaka Yasuda
 
Goの文法の実例と解説
Goの文法の実例と解説Goの文法の実例と解説
Goの文法の実例と解説Ryuji Iwata
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixirk1complete
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半Tetsuya Morimoto
 

What's hot (9)

Javascript basic code
Javascript basic codeJavascript basic code
Javascript basic code
 
Erlangのマルチプロセスを触ってみた
Erlangのマルチプロセスを触ってみたErlangのマルチプロセスを触ってみた
Erlangのマルチプロセスを触ってみた
 
わかるコードを書くために For writing clean code
わかるコードを書くために For writing clean codeわかるコードを書くために For writing clean code
わかるコードを書くために For writing clean code
 
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
Rubyにおける構文追加の試み 〜ボクとRubyと俺々文法〜
 
OpenFlowコントローラ開発支援ツールの提案
OpenFlowコントローラ開発支援ツールの提案OpenFlowコントローラ開発支援ツールの提案
OpenFlowコントローラ開発支援ツールの提案
 
Goの文法の実例と解説
Goの文法の実例と解説Goの文法の実例と解説
Goの文法の実例と解説
 
Development app-with-elixir
Development app-with-elixirDevelopment app-with-elixir
Development app-with-elixir
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
 
Gaej Jdo
Gaej JdoGaej Jdo
Gaej Jdo
 

More from Kotaro Kawashima

THE BEM: Better Css Naming Conventions
THE BEM: Better Css Naming ConventionsTHE BEM: Better Css Naming Conventions
THE BEM: Better Css Naming ConventionsKotaro Kawashima
 
俺的フロントエンド開発
俺的フロントエンド開発俺的フロントエンド開発
俺的フロントエンド開発Kotaro Kawashima
 
hachioji.pm #40 : asynchronous in JS
hachioji.pm #40 : asynchronous in JShachioji.pm #40 : asynchronous in JS
hachioji.pm #40 : asynchronous in JSKotaro Kawashima
 
Middleman Usecase / TokyouMiddlemanMeetup#1
Middleman Usecase / TokyouMiddlemanMeetup#1Middleman Usecase / TokyouMiddlemanMeetup#1
Middleman Usecase / TokyouMiddlemanMeetup#1Kotaro Kawashima
 

More from Kotaro Kawashima (6)

THE BEM: Better Css Naming Conventions
THE BEM: Better Css Naming ConventionsTHE BEM: Better Css Naming Conventions
THE BEM: Better Css Naming Conventions
 
俺的フロントエンド開発
俺的フロントエンド開発俺的フロントエンド開発
俺的フロントエンド開発
 
hachioji.pm #40 : asynchronous in JS
hachioji.pm #40 : asynchronous in JShachioji.pm #40 : asynchronous in JS
hachioji.pm #40 : asynchronous in JS
 
Middleman Usecase / TokyouMiddlemanMeetup#1
Middleman Usecase / TokyouMiddlemanMeetup#1Middleman Usecase / TokyouMiddlemanMeetup#1
Middleman Usecase / TokyouMiddlemanMeetup#1
 
Hachiojipm #28
Hachiojipm #28Hachiojipm #28
Hachiojipm #28
 
Hachioji.pm No21
Hachioji.pm No21Hachioji.pm No21
Hachioji.pm No21
 

jQuery.Deferredってシンプルなんだぜ