Javascript 为什么来自Promise的回调是反模式的呢

Javascript 为什么来自Promise的回调是反模式的呢,javascript,angularjs,angular-promise,anti-patterns,Javascript,Angularjs,Angular Promise,Anti Patterns,我看到了StackOverflow的答案,人们建议为AngularJS服务提供回调函数 app.controller('tokenCtrl', function($scope, tokenService) { tokenService.getTokens(function callbackFn(tokens) { $scope.tokens = tokens; }); }); app.factory('tokenService', function($http)

我看到了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
服务返回承诺并拥有
。然后
方法执行回调函数感觉像是一种不健康的控制反转


一个人如何重新考虑像这样的代码,如何解释为什么原来的方法不是一个好主意

var getTokens = function() {
      return $http.get('/api/tokens');
    };
然后在其他模块中使用

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

至于为什么它是反模式,我想说,首先,它不允许您进一步链接成功/失败处理程序方法。其次,它处理处理处理从调用方模块到被调用模块的响应的控制(这在这里可能不是非常重要,但它仍然施加相同的控制反转)。最后,您将承诺的概念添加到您的代码库中,这对某些队友来说可能不太容易理解,但随后将承诺用作回调,因此这真的没有意义。

您应该将其更改为

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.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
    方法检索

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


告诉人们实际使用承诺,而不是忽略承诺。我发现使用
promise
有点健康,因为它能够链接承诺并控制异步调用。主要问题是
then()
中没有返回任何内容,回调中就没有地方可以捕捉错误。它打破了承诺链使用承诺会使代码更短、更简单。此服务返回对象没有多大意义。。。它需要返回一个承诺,以便使用它的任何人都可以知道数据何时准备好。只要告诉人们实际使用承诺,而不是忽略它们。我发现使用
promise
是一种健康的做法,因为它能够链接承诺并控制异步调用。主要问题是
then()中没有返回任何内容
回调中无处可捕捉错误。它打破了承诺链使用承诺会使代码更短、更简单。此服务返回对象没有多大意义。。。它需要返回一个承诺,以便任何使用它的人都能知道数据何时准备好。