16
16

More than 5 years have passed since last update.

AngularJSで$httpの返すPromiseにどのようにsuccess / errorが追加されているか調べてみた

Last updated at Posted at 2014-09-09

応用可能性の低そうなメモ。

AngularJSの\$httpでは、戻り値のpromiseについて、通常のthenのほかに、success / errorを使うことができます。これはどうしてなのでしょうか?AngularJSのpromiseの隠し仕様で、戻り値の関数名を指定することができるのか、それとも隠しメソッドとして、sucess / errorを持っているのか?などと妄想が膨らんでしまいます。

そこで、AngularJSのコードを読んでみると、大したことはなく、

        promise.success = function(fn) {
            promise.then(function(response) {
                fn(response.data, response.status, response.headers, config);
            });
            return promise;
        };
        promise.error = function(fn) {
            promise.then(null, function(response) {
                fn(response.data, response.status, response.headers, config);
            });
            return promise;
        };

上記コードでsuccess, errorが追加されているだけでした。単にthenのシンタックスシュガーというだけでなく、responseオブジェクトを変数に展開する役割を持っていたんですね・・・。となると、これがPromise全般に実装されていないのも納得できます。

さて、これを応用して、promiseではない通常のデータを\$httpと同じ仕様で戻すための変換処理を書くと以下のようになります。\$httpのキャッシング処理を自前で実装するとき(しかも、どうしても\$httpの外側で処理を行いたいとき)に使える方法です。$q.whenというのがまさにこの用途で使われるメソッドなので、そこにsuccess / errorの追加を実装しただけです。

    function httpize(data, status, headers, config){
        var promise = $q.when({
            data: data,
            status: status,
            headers: headers
        })
        promise.success = function(fn) {
            promise.then(function(response) {
                fn(response.data, response.status, response.headers, config);
            });
            return promise;
        };
        promise.error = function(fn) {
            return promise;
        };
        return promise;
    }
    //Demo
    httpize('target data', 200)
        .success(function(data, status){
            console.log(data, status)
        })

ちなみに、本来自分がやりたかったことはこちらで、sucess / errorの実装方法を調べたのもこのためでしたが、応用可能性が低そうなので、タイトルは違うものにしてみました。

16
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
16