Deferredその2:deferred.state()、resolve()、reject()、done()、fail()を検証してみる
2016/05/07
deferred.state()、resolve()、reject()、done()、fail()を検証してみる
前の記事で、Deferred使う事の理由を述べましたが、具体的な使い方を書いて行こうと思います。
今回はstate()状態について、そしてその状態による分岐、主なdeferred検証観点はstate()、resolve()、reject()、done()、fail()を使用。
なお、jQueryバージョン1.7まではisResolvedとisRejectedというメソッドがありましたが、1.8からは廃止となりました。
deferred.state()を使っていくものとします。
一般的な単語としてのpendingは「保留」、rejectは「拒否」という言葉が良く思い浮かびますが、
jQuery.Deferredにおいては「未解決」というニュアンスが強いので「未解決」という言葉を使っていきます。同じ理由としてrejectの「拒否」についても「却下」という言葉を使っていきます。
deferred状態の検証サンプルコード
文章だけでは、やはり分かりにくいのでdeferredサンプルコードをもとに説明していきます。
state()、resolve()、reject()、done()、fail()のjQueryサンプル
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="../../js/jquery-1.12.2.min.js"></script>
<script>
$(function(){
var msg;
// Deferredオブジェクト作成
var defer_1 = new $.Deferred;
// [1]
// .state()
msg = "[1]Deferredオブジェクト作成直後に.state():" + defer_1.state();
$("ul").append("<li>" + msg + "</li>");
// .resolve()
defer_1.resolve();
// [2]
// .resolve()での.state()
msg = "[2].resolve()をした後での.state():" + defer_1.state();
$("ul").append("<li>" + msg + "</li>");
// [3]
// .resolve() - .done(data)
// .done(data)の受取り値は何もないのでundefined
defer_1.done(function(data){
msg = "[3]resolve()での.done(data)での受取り値:" + data;
$("ul").append("<li>" + msg + "</li>");
})
// [4]
// .resolve() - .promise().done(data)
// プロミスの.done(data)でも当然undefined
defer_1.promise().done(function(data){
msg = "[4]resolve()での.promise().done(data)での受取り値:" + data;
$("ul").append("<li>" + msg + "</li>");
})
// [5]
// .resolve() - .fail(data)
// .resolve()をしたので、.fail(data)自体実行されない
defer_1.fail(function(data){
msg = "[5]resolve()での.fail(data)での受取り値:" + data;
$("ul").append("<li>" + msg + "</li>");
})
// [6]
// .resolve() - .promise().fail(data)
// プロミスからも当然、.fail(data)自体実行されない
defer_1.promise().fail(function(data){
msg = "[6]resolve()での.promise().fail(data)での受取り値:" + data;
$("ul").append("<li>" + msg + "</li>");
})
// ここで.resolve()をもう一回してみる、今度は引数付き。
defer_1.resolve("resolve()2回目の引数");
// [7]
// .resolve() - resolve(data) - .done(data)
// 2回目の.resolve(data)で引数を付けても、1回目で付けてない場合はundefined
defer_1.done(function(data){
msg = "[7]resolve() - resolve(data)での.done(data)での受取り値:" + data;
$("ul").append("<li>" + msg + "</li>");
})
// [8]
// .resolve() - resolve(data) - .promise().done(data)
// プロミスの.done(data)でも1回目のresolve()で引数を与えないと、2回目で与えてもundefined
defer_1.promise().done(function(data){
msg = "[8]resolve() - .resolve(data)での.promise().done(data)での受取り値:" + data;
$("ul").append("<li>" + msg + "</li>");
})
// .resolve() をした後に .reject()
defer_1.reject();
// [9]
// .resolve() - .reject() - .state()
msg = "[9].resolve()をした後でさらに.reject()をして.state():" + defer_1.state();
$("ul").append("<li>" + msg + "</li>");
// Deferredオブジェクト作成
var defer_2 = new $.Deferred;
// .reject()
defer_2.reject("reject()の引数");
// [10]
// .reject()での.state()
msg = "[10].reject()をした後での.state():" + defer_2.state();
$("ul").append("<li>" + msg + "</li>");
// [11]
// .reject() - .done(data)
// .reject()をしたので、.done(data)自体実行されない
defer_1.done(function(data){
msg = "[11]reject()での.done(data)での受取り値:" + data;
$("ul").append("<li>" + msg + "</li>");
})
// [12]
// .reject() - .fail(data)
// .reject()をしたので、.fail(data)が実行される
defer_1.fail(function(data){
msg = "[12]reject()での.fail(data)での受取り値:" + data;
$("ul").append("<li>" + msg + "</li>");
})
});
</script>
</head>
<body>
<ul>
</ul>
</body>
</html>
※state()、resolve()、reject()、done()、fail()のjQueryサンプルの結果と照らし合わせてみると分かりやすいです
[1]Deferredオブジェクト作成直後に.state()の結果は未解決となります
[2].resolve()の後に.state()の結果は解決済みとなります
[3]解決済みなので、Deferredコールバックの移動先は.done()となります、ただし.resolve()の時に引数の指定が何も無かったので、当然.done()で引数は取れず出力結果はundefinedです
[4]プロミスの場合も.resolve()で引数指定してなかったので、やはり結果は[3]と同じ
[5]解決済みなので、Deferredコールバックは.fail()には行きません
[6]プロミスの場合も解決済みになっている事には変わりないので、やはり結果は[5]と同じ
[7]ここで一度.resolve()引数無しにしたDeferredオブジェクトに今度は.resolve()引数有りにしてみるが、1回目で引数を指定していなかったんで、.done()で引数は受け取れず
[8]プロミスの場合も1回目で引数を指定してないと、2回目でも取れない。
[9].resolve()の後に.reject()、つまり解決済みの後に却下をして解決済みものまま。
[10]新規Deferredオブジェクト作成直後に.reject()をすれば、状態は却下となる。
[11]却下なので、Deferredコールバックは.done()には行きません
[12]却下なので、Deferredコールバックはの移動先は.fail()となり、.reject()で引数を指定しているので、引数の値を受けとる事が出来ます
state()、resolve()、reject()、done()、fail()のjQueryサンプルの結果
これらの検証で分かる事は、一度.resolve()や.reject()したDeferredオブジェクトの状態はもう変わらず、引数についても同じという事でしょうか。
