为什么承诺的回调是反模式的?

为什么承诺的回调是反模式的?

我在StackOverflow上看到了答案,人们建议为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    };});

在我看来,这是一种反模式。这个$http服务返回承诺.then方法执行回调函数感觉就像不健康的控制反转。

如何再因素这样的代码,以及如何解释为什么最初的方法是不是个好主意?


沧海一幻觉
浏览 556回答 3
3回答

aluckdog

你应该把它改成var getTokens = function() {       return $http.get('/api/tokens');     };然后,在其他模块中使用yourModule.getTokens()   .then(function(response) {     // handle it   });至于为什么它是反模式,首先,它不允许您进一步链接成功/失败处理程序方法。其次,它处理从调用模块到被调用模块的响应的控制(这在这里可能不是非常重要,但它仍然强制执行相同的控制反转)。最后,您将承诺的概念添加到代码库中,这对于一些队友来说可能不是那么容易理解,但随后使用承诺作为回调,所以这真的没有意义。

子衿沉夜

代码可以按以下方式重新分解: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方法。这个承诺可以转发给其他客户。

手掌心

这个返回对象的服务没有多大意义.它需要返回一个承诺,这样无论什么用途,它都可以知道什么时候数据准备好了。
打开App,查看更多内容
随时随地看视频慕课网APP