2017-01-02 13 views
0

約束を返す角張ったサービスがあれば、この約束の消費者がエラーを処理するかどうかを検出できますか?私はサービスでデフォルトのエラー処理を提供したいが、エラーハンドラが実行チェーンの下で定義されていない場合にだけ使用されるようにする。

サービスメソッドは次のようになります。消費者は、エラーハンドラを提供している場合は、エラーがそれによって独占的に取り扱ってください

1):

function serviceMethod(method, url, data) 
{ 
    return $http({ 
     method: method, 
     url: url, 
     data: data 
    }) 
    .then(
     function (response) { 
      return response; 
     }, 
     function (response) { 
      console.log('ERROR!'); // default error handling 
     } 
    ); 
} 

serviceMethod戻りますので、約束を、。

$scope.getResponse = function() { 
    return Services.serviceMethod('put', $scope.url, $scope.someData) 
    .then(function (response) { 

    }, function (error) { 
     // Custom error handling. 
    }); 
} 

2)コンシューマーがハンドラーを提供しない場合、エラーはサービス・ハンドラーによって排他的に処理される必要があります。

serviceMethodの最初の後継で達成することは可能ですか?チェーン内のどこでも可能です(エラーはエラーハンドラを提供するために最初のコンシューマによってのみ処理されます)。

+0

エラーを処理するために**。catch **を使用しないでください。私が覚えている限り、通常のチェーンは '$ http(something).then(success).catch(error)'です。とにかく、事柄をより明確にしたい場合は、それぞれのケースからオブジェクトを返すことがあります。エラーの場合は、 '{success:false、error:errovariable}'を返すことがあります。 – briosheje

+0

'catch'は' promise.then(null、errorCallback) 'の短縮形ではありませんか? 私のチェーンは少し長くなり、一般的に '($ http(something).then(successHandler、errorHandler))。then(successHandler、errorHandler)'などのようになります。エラーハンドラはオプションです。 – pSoLT

+0

各HTTPリクエストにはレスポンスがあり、チェーン数に関係なく、単一のキャッチ(エラー)を処理できます。それぞれのレスポンスは成功シナリオとエラーシナリオを提供します。それぞれの単一のケースを手動で処理したい場合は、(上記のように)オブジェクトを返すか、あるいはいくつかのコールバックを定義してサービスハンドラから呼び出すことができます。 – briosheje

答えて

0

ご回答いただいたコードに回答があります。

function serviceMethod(method, url, data) 
{ 
    return $http({ 
     method: method, 
     url: url, 
     data: data 
    }) 
    .then(
     function (response) { 
      return response; 
     }, 
     function (response) { 
      return response; // default error handling 
     } 
    ); 
} 

そして、あなたのgetResponse方法:

$scope.getResponse = function() { 
    return Services.serviceMethod('put', $scope.url, $scope.someData) 
    .then(function (response) { 

    }, function (error) { 
     alert(error.code); //Default error handling returned from error function in serviceMethod 
     alert("My custom error"); //Custom error handling 
    }); 
} 
+0

これは私にコードを複製し、同じことを何度も何度も書き直すように強制します。デフォルトの動作はグローバルで大部分のケースで使用されるため、共通のグローバルな抽象化で定義する必要があります。 – pSoLT

+0

私はそうは思わない、これよりも良いかもしれない。呼び出し可能なサービスは約束を返し、 'getResponse'メソッドは' serviceMethod'のエラーメソッドによって返されたエラーを受け取ります。 –

0

それはサービスthrowエラー応答で拒否ハンドラことが非常に重要である。このようにそれを実行してください。さもなければ、$ qサービスはを拒否された約束を成功した応答に変換するになります。

function serviceMethod(method, url, data) { return $http({ method: method, url: url, data: data }) .then( function (response) { return response; }, function (errorResponse) { //return response; // default error handling throw errorResponse; //OR //return $q.reject(errorResponse); } ); } 

一般的な問題は、拒絶された約束が、何かを返さないことによって約束された約束に誤って変換されることです。関数がreturnステートメントを省略すると、関数はundefinedの値を返します。その場合、$ qサービスは、拒否された約束を、undefinedという値で解決される約束に変換します。


と言われています。いいえ、サービスでは、消費者が拒否された約束をどのように使用するのかを知ることはできません。消費者がサービスでデフォルトのエラー処理をスキップしたい場合は、サービスコールで指定する必要があります。

function serviceMethod(method, url, data, skipErrorHandling) 
{ 
    return $http({ 
     method: method, 
     url: url, 
     data: data 
    }) 
    .then(function (response) { 
     return response.data; 
    }) 
    .catch(function (errorResponse) { 
     if (skipErrorHandling) 
      throw errorResponse; 
     } 
     //Put error handler here 
     //Correct error 
     var promise = retry(method, url, data); 
     return promise; 
    ); 
} 
関連する問題