4

アプリで利用できるようにそよ風をラップする単純な angularjs サービスがあります。このサービスでは、失敗を処理するための単一のメカニズムが必要です。呼び出しの最後に .fail() を連鎖させようとしましたが、簡単な呼び出しが失敗した場合 (たとえば、ユーザーがログアウトされたために)、失敗が呼び出されます。唯一の問題は、チェーン内の最初の .done() (通常はサービスを呼び出すコントローラーにある) も呼び出されることです。これは、そよ風が成功したときにのみ呼び出されるようにします。

最初の完了も呼び出されないようにするにはどうすればよいですか?

以下は、save 呼び出しのサンプルです (done が誤って呼び出されています)。

dataStore.saveEntity(model)
    .then(function() {
    // This is being called on fail             
});

そしてサービスラッピング風のスニペット

angular.module('app')
.factory('dataStore' ,function() {

        var _handleFail = function(error) {
            if (error && error.status && error.status === 401) {
                // Logged out error (for example

            }
        };



        function saveEntity(entity) {   
           return manager.saveChanges(entity).fail(_handleFail);    
        }
4

3 に答える 3

3

.fail() がプロミスをさらに伝播することがわかりました。次の点を考慮してください。

promise.then(function(){
      console.log('Then 1');
      throw new Error('Error');
  })
  .then(function(){
      console.log('Then 2');
  })
  .then(function(){
      console.log('Then 3');   
  })
  .fail(function(){
      console.log('Fail 1');   
  })
  .then(function(){
      console.log('Then 4');
  });

出力します:

> Then 1
> Fail 1
> Then 4

.fail() は、最初の .then() からエラーをキャッチし、4 番目の .then() に promise を渡します。私の例では、そよ風のクエリがエラーを生成し、それが .fail() によってキャッチされ、処理されてから、promise が呼び出しコンテナー内の .then() に渡されます。

これを修正するには、_handleFail() 関数でエラーをスローして、チェーン化された .then() が呼び出されないようにする必要があります (再びエラーが .fail() によって処理されるまで)。

したがって、私のサービスは次のようになります。

angular.module('app') .factory('dataStore' ,function() {

    var _handleFail = function(error) {
        if (error && error.status && error.status === 401) {
            // Logged out error (for example
            throw new Error('Unauthorized');
        }
    };



    function saveEntity(entity) {   
       return manager.saveChanges(entity).fail(_handleFail);    
    }
于 2013-09-18T12:04:07.067 に答える
0

プロミスチェーンで「then」の前に「fail」が呼び出される例は実際には見たことがありません。したがって、コードを次のように書き直してみます。

function handleFail(error) {
    if (error && error.status && error.status === 401) {
        // Logged out error (for example

    }
};


dataStore.saveEntity(model)
 .then(function() {
    // your success code here. - should not get called except on success.
 }).fail(handleFail);

そしてサービスラッピング風のスニペット

angular.module('app')
   .factory('dataStore' ,function() {

        function saveEntity(entity) {   
           return manager.saveChanges(entity);
        }
    });

他の方法もあるかもしれませんが、これが最も簡単なようです。

于 2013-09-17T22:29:53.580 に答える