2016-02-26 15 views
6

Widziałem odpowiedzi na StackOverflow gdzie ludzie sugerują dostarczenie funkcji zwrotnej do usługi AngularJS.Dlaczego wywołania zwrotne z Promise `.then` Methods Anti-Pattern

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

Wydaje mi się, że to anty-wzór. Usługa $http zwraca obietnice i wykonanie metod wywołania zwrotnego sprawia wrażenie niezdrowej inwersji kontroli.

Jak działa ten jeden kod ponownie kod i jak wyjaśnić, dlaczego oryginalny sposób był nie jest dobrym pomysłem?

+2

Po prostu powiedz ludziom, żeby rzeczywiście korzystali z obietnic zamiast ich ignorować. – SLaks

+0

Zauważyłem, że używanie 'obietnicy' jest w pewnym sensie zdrowe, ponieważ ma zdolność do łańcuchowania i kontroli nad połączeniem asynchronicznym. –

+4

Głównym problemem jest to, że gdy nic nie jest zwracane w 'then()' nie ma gdzie złapać błędów w wywołaniu zwrotnym. Łamie obietnicę łańcuchową – charlietfl

Odpowiedz

0

Kod może być ponownie uwzględnionych w następujący sposób:

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

Poprzez usługa zwrócić obiecujące i używając sposobu obiecujących wyników, same funkcje uzyskuje się następujące korzyści .then:

  • Obietnica może zostać zapisana i użyta dla przykuwania.

  • Obietnicę można zapisać i użyć, aby uniknąć powtarzania tego samego połączenia $http.

  • Informacje o błędzie są przechowywane i można je odzyskać za pomocą metody .catch.

  • Obietnica może zostać przekazana innym klientom.

7

należy go zmienić na

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

A, a następnie w innych zastosowań modułu

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

Na pytanie dlaczego jest to anty-wzorzec, powiedziałbym, że, po pierwsze, to nie robi pozwala ci dalej łączyć metody sukcesu/niepowodzenia obsługi. Po drugie, kontroluje przetwarzanie odpowiedzi z modułu wywołującego na zwany moduł (co może nie być tutaj bardzo ważne, ale nadal narzuca taką samą inwersję sterowania). Na koniec dodajesz koncepcję obietnic do swojej bazy kodów, która może nie być łatwa do zrozumienia dla niektórych członków zespołu, ale potem użyj obietnic jako zwrotów, więc to naprawdę nie ma sensu.

+0

Edytowano z wyjaśnieniem, dziękuję) –

Powiązane problemy