Por que os callbacks de methods Promise `.then ‘são um antipadrão

Eu vi respostas no StackOverflow onde as pessoas sugerem fornecer uma function de retorno de chamada para um serviço AngularJS.

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 }; }); 

Isto parece-me ser um anti-padrão. O serviço $http retorna promises e, .then methods que executam funções de retorno de chamada parecem uma inversão insalubre de controle.

Como um fator re-factor como este e como se explica por que o caminho original não foi uma boa idéia?

Você deve mudar para

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

E, em seguida, no outro uso do módulo

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

Quanto ao porquê de ser um anti-padrão, eu diria que, em primeiro lugar, ele não permite que você encadeie seus methods manipuladores de sucesso / falha. Segundo, ele lida com o controle do processamento da resposta do módulo chamador para o módulo chamado (o que pode não ser super importante aqui, mas ainda impõe a mesma inversão de controle). E, finalmente, você adiciona o conceito de promises à sua base de código, que pode não ser tão fácil de entender para alguns dos colegas de equipe, mas depois usa promises como callbacks, então isso realmente não faz sentido.

O código pode ser reformulado da seguinte maneira:

 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 }; }); 

Ao fazer o serviço retornar uma promise e usar o método da promise, a mesma funcionalidade é obtida com os seguintes benefícios:

  • A promise pode ser salva e usada para encadeamento .

  • A promise pode ser salva e usada para evitar a repetição da mesma chamada $http .

  • As informações de erro são retidas e podem ser recuperadas com o método .catch .

  • A promise pode ser encaminhada para outros clientes.

Intereting Posts