2013-09-30 8 views
6

私はjQueryのを使用してのJavascript APIクライアントを書いています方法をデフォルトの提供「失敗」。私のトップレベルの要求方法は、次のようになります。jQueryの繰延オブジェクト

function request(method, uri, params, proxies) { 
    var deferred = $.Deferred(); 
    $.ajax({ 
    data: method == 'GET' ? params : JSON.stringify(params), 
    contentType: 'application/json', 
    dataType: 'json', 
    url: api.root + uri, 
    type: method, 
    xhrFields: { 
     withCredentials: true 
    } 
    }).done(function(body) { 
    deferred.resolveWith(this, [body.data]); 
    }).fail(function(xhr) { 
    deferred.rejectWith(this, [xhr]); 
    }); 

    return deferred.promise(); 
}, 

は、どのように私は私の返却延期のデフォルトfailハンドラを持つことができますか?つまり、deferredに他のハンドラが接続されていない場合は、デフォルトのハンドラを呼び出します。

特定の処理を持つ部分を除いて、グローバル例外処理をアプリケーションで行うには、この処理を行いたい(遅延処理で独自のfailハンドラを定義します)。

+5

繰延オブジェクトは動作しません。そうですね。代わりに、グローバル・エラー・ハンドラを用意し、そのajaxリクエストのグローバル・イベントを無効にします。 –

+0

ここでは '$ .Deferred'インターフェースを使用しないでください。 '$ .ajax()'によって返された約束について、 'then'メソッド(古いjQueryバージョンでは' pipe')を呼び出してください! – Bergi

+0

(http://api.jquery.com/ajaxError/)グローバル[ 'ajaxError'イベント]あります、そしてあなたは([$ .ajaxSetup'']使用することができますhttp://api.jquery.com/jQuery.ajaxSetup /)を使用します。 – Bergi

答えて

3

ので、2016年のようにAPIでjQueryのAJAXを使用するためのクリーンな方法は、約束を返すことです。しかし、呼び出し元がエラーハンドラを約束に添付しているかどうかを判断することはできません。

だから、私がお勧めしたいことは、あなただけの呼び出し側がエラー処理の世話をするため、デフォルトのエラー処理を適用しないように機能を告げるあなたの関数に新しい引数を追加することです。

function request(method, uri, params, proxies, skipDefaultErrorHandling){ 
    // default error handling will be used if nothing is passed 
    // for skipDefaultErrorHandling 
    var p = $.ajax({ 
     data: method=='GET'?params:JSON.stringify(params), 
     contentType: 'application/json', 
     dataType: 'json', 
     url: api.root + uri, 
     type: method, 
     xhrFields: { 
      withCredentials: true 
     } 
    }); 
    if (!skipDefaultErrorHandling) { 
     // apply default error handling 
     p = p.then(null, function(jqXHR, textStatus, errorThrown) { 
      // put here whatever you want the default error handling to be 
      // then return the rejection with the various error parameters available 
      return $.Deferred().reject([jqXHR, textStatus, errorThrown]); 
     }); 
    } 

    return p; 
}; 

その後、呼び出し側はちょうど自分自身のエラー処理を適用したりするかどうかを決定:そして、私はあなただけ$.ajax()が既に返し、既存の約束を使用してのではなく、あなた自身が延期作成することにより、約束アンチパターンを避けることをお勧めしたいですない:

request(...).then(function(data) { 
    // success code here 
}); 

それとも、あなたが渡す非約束failHandlerコールバックして、デフォルトのエラー処理で行くことができるfailHandlerが渡されたかどうかを確認します。これは約束とコールバックのハイブリッドであると私は通常、建築家を選ぶのでしょうものではありませんが、あなたの質問には対応していない約束何かを要求するので、これはそれを達成するための一つです:

function request(method, uri, params, proxies, failHandler){ 
    // default error handling will be used if nothing is passed 
    // for skipDefaultErrorHandling 
    var p = $.ajax({ 
     data: method=='GET'?params:JSON.stringify(params), 
     contentType: 'application/json', 
     dataType: 'json', 
     url: api.root + uri, 
     type: method, 
     xhrFields: { 
      withCredentials: true 
     } 
    }); 
    // apply default error handling 
    p = p.then(null, function(jqXHR, textStatus, errorThrown) { 
     if (failHandler) { 
      // call passed in error handling 
      failHandler.apply(this, arguments); 
     } else { 
      // do your default error handling here 
     } 
     // then keep the promise rejected so the caller doesn't think it 
     // succeeded when it actually failed 
     return $.Deferred().reject([jqXHR, textStatus, errorThrown]); 
    }); 

    return p; 
};