2016-02-26 11 views
6

私は、コールバック関数をAngularJSサービスに提供することを提案するStackOverflowに関する回答を見てきました。Promiseからのコールバックがなぜ `.then`メソッドでアンチパターンであるのですか?

app.controller('tokenCtrl', function($scope, tokenService) { 
    tokenService.getTokens(function callbackFn(tokens) { 
     $scope.tokens = tokens; 
    }); 
}); 

app.factory('tokenService', function($http) { 
    var getTokens = function(callbackFn) { 
     $http.get('/api/tokens').then (function onFulfilled(response) { 
      callbackFn(response.data); 
     }); 
    }; 

    return { 
     getTokens: getTokens 
    }; 
}); 

これは私には反パターンと思われます。 $httpサービスは約束を返し、.thenメソッドコールバック関数を実行すると、不健全な制御の逆転のように感じます。

どうすればいいですかこのようなコードをコードとし、元の方法がどういう理由で説明したのですかいいですか?

+2

実際に約束を無視する代わりに使用するように伝えてください。 – SLaks

+0

私は 'promise'を使うのが健康であることがわかりました。それはそれをチェーン化し、非同期呼び出しを制御できるからです。 –

+4

主な問題は、 'then()'に何も返されなければ、コールバックのエラーを捕捉することはありません。それは約束を使用して約束のチェーンを破る – charlietfl

答えて

0

次のようにコードを再因数分解することができる:

app.controller('tokenCtrl', function($scope, tokenService) { 
    tokenService.getTokens.then (callbackFn(tokens) { 
     $scope.tokens = tokens; 
    }); 
}); 

app.factory('tokenService', function($http) { 
    var getTokens = function() { 
     //return promise 
     return $http.get('/api/tokens').then (function onFulfilled(response) { 
       //return tokens 
       return response.data; 
      } 
     ); 
    }; 

    return { 
     getTokens: getTokens 
    }; 
}); 

サービスが約束を返す有し、約束の.then方法を用いることにより、同一の機能が次の利点を用いて達成される:

  • 約束を保存してチェーニングに使用できます。

  • 約束を保存して、同じ$httpコールを繰り返さないようにすることができます。

  • エラー情報は保持され、.catchメソッドで取得できます。

  • 約束は他のクライアントに転送することができます。

7

あなたは

var getTokens = function() { 
     return $http.get('/api/tokens'); 
    }; 

にそれを変更する必要がありますそして、それはアンチパターンだ理由として、他のモジュール使用中

yourModule.getTokens() 
    .then(function(response) { 
    // handle it 
    }); 

、私は最初、それはdoesnの、と言うだろう成功/失敗ハンドラメソッドをさらにチェーン化することはできません。第2に、呼び出し元モジュールから呼び出されたモジュールへの応答を処理する制御を処理します(ここではそれほど重要ではないかもしれませんが、依然として同じ制御の逆転が課せられます)。最後に、あなたのコードベースに約束のコンセプトを追加します。これは、チームメイトの中には理解しにくいかもしれませんが、約束をコールバックとして使用することは実際には意味がありません。

+0

説明付きで編集しました、ありがとう) –

関連する問題