为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

沧海一幻觉 2019-07-11 12:40:23
为什么承诺的回调是反模式的?我在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方法执行回调函数感觉就像不健康的控制反转。如何再因素这样的代码,以及如何解释为什么最初的方法是不是个好主意?
查看完整描述

3 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

你应该把它改成

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

然后,在其他模块中使用

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

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


查看完整回答
反对 回复 2019-07-11
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

代码可以按以下方式重新分解:

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方法。

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


查看完整回答
反对 回复 2019-07-11
?
手掌心

TA贡献1942条经验 获得超3个赞

这个返回对象的服务没有多大意义.它需要返回一个承诺,这样无论什么用途,它都可以知道什么时候数据准备好了。

查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 555 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信