応用可能性の低そうなメモ。
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の実装方法を調べたのもこのためでしたが、応用可能性が低そうなので、タイトルは違うものにしてみました。