小编典典

为什么从Promise`.then`中进行回调是一种反模式

javascript

我在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服务返回promise,让.then方法执行回调函数感觉像是对控件的不良转换。

一个人如何 重因子 这样和代码如何解释为什么原始的方式是 不是一个好主意?


阅读 384

收藏
2020-04-25

共1个答案

小编典典

该代码可以按如下方式重构:

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方法,可以实现相同的功能,并具有以下好处:

  • Promise可以保存并用于 链接

  • 可以保存承诺并用于避免重复同一$http呼叫。

  • 错误信息将保留并可以通过该.catch方法检索。

  • 承诺可以转发给其他客户。

2020-04-25