解決したい課題
例えば以下のようなケースを考える。
sample.js
//~ ~ ~ app logic ~ ~ ~
getInfo('hoge').done(function(response) {
alert('OK!');
}).fail(function(response) {
alert('NG!');
});
sdk.js
function getInfo(request) {
return $.ajax({
type : 'GET',
url : 'http://foo.bar/' + request,
});
}
WebAPIをWrapするSDKを開発するとして、ajaxの実行部分の実装を切り出して、ajaxの戻り値をそのまま返すような関数を実装したとする。
上記のsample.js
の挙動としては、sdk.js
の関数を呼び出してajax通信が成功したらdone
、失敗したらfail
が呼ばれる。
ここで、getInfo
に渡すパラメータが通信するまでもなく不正な場合、通信コストを減らすために通信する前にエラーを返す、つまりfailを呼んであげたいところ。
SDKの実装を少し工夫する
ではajaxの実行前にパラメータチェックを入れ、アプリ側でdone
とfail
をちゃんとハンドルできるように変更してみる。
sdk.js
function getInfo(request) {
if (!isValid(request)) {
return {
done : function() {
return this;
},
fail : function(callback) {
callback({message : 'invalid parameter'});
return this;
}
};
}
return $.ajax({
type : 'GET',
url : 'http://foo.bar/' + request,
});
}
function isValid(param) {
// ~ 略 ~
}
こんな感じに、パラメータ不正の場合はgetInfo
の戻り値でdoneとfailのプロパティを持ったオブジェクトを返してやれば良い。
注意点としては、ちゃんとdoneも返してあげないと、アプリ側がfailよりも先にdoneを実装した場合にfailが呼ばれなくなってしまう点。doneは何もせずにthisを返せばOK。