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オブジェクトの状態はもう変わらず、引数についても同じという事でしょうか。