当前位置: 首页 > 面试题库 >

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

潘涵煦
2023-03-14
问题内容

我在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方法执行回调函数感觉像是对控件的不良转换。

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


问题答案:

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

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

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



 类似资料:
  • 我正在尝试使用Promise API编写重新连接到超时数据库的代码。 我最后做的是把连接DB的promise包装成一个promise,但我不确定这是否是最好的方式。我想可能有一种方法可以使用最初的promise,从尝试连接到数据库,但我无法找到它。 我认为没有setTimeout块是可能的,但我无法解决它。

  • 这个答案几乎描述了问题的前半部分。 上面写着: 看过“四人帮”的定义后,我不相信这有什么真正的区别。(为方便起见包括在内) 装饰器:允许对对象进行动态包装,以便修改它们现有的职责和行为 责任链:通过将接收对象链接在一起,使多个对象有机会处理请求 维基百科对它们做了一些补充,但有些是武断的。 > 装饰器通常作为链表实现。但我认为这太低了,不能被认为是模式的“一部分”。 责任链只处理数据,如果这是他们

  • 我正在学习亚当·简斯的合唱团教程。 数据是用这个代码块加载的 而准备就绪被定义为 我把这个序列理解为 首先-创建一个名为promises的数组,其中第一项是来自此链接的已解析json,第二项是来自该文件的id/值对的映射 第二,获取promise变量中的所有promise,如果成功,则触发函数ready,如果失败,则不执行任何操作 如果这是对的,那么相对于这样的东西有什么优势呢?我用伪代码写这个因

  • 我最近一直在摆弄api,并注意到一些有点古怪的东西。 返回一个对象。http://jsbin.com/wofulo/2/edit?js输出 但是,如果写为: 这里是一个标准的,您可以访问title属性 所以我的问题是:为什么在对象文本中返回一个promise,但是如果刚刚返回,则返回值?

  • 问题内容: 给定 为什么 在链接到电话吗? 问题答案: 因为没有ed 或其他值从链接到构造函数。 请注意,将返回一个新对象。 解决方案是使用value或from 的值或其他函数调用。

  • 问题内容: 在Parallel Python中,它在 Submit 函数中有一个叫 回调 (documentation)的东西,但是似乎并不能很好地解释它。我几天前已在他们的论坛上发布了消息,但没有收到任何回复。有人可以解释什么是回调及其用途吗? 问题答案: 回调是API使用者提供的功能,API可以转回并调用(回调您)。如果我设置了博士的约会,我可以给他们我的电话号码,这样他们就可以在前一天给我打