【问题标题】:Service which returns multiple promises based on data from single HTTP request根据来自单个 HTTP 请求的数据返回多个承诺的服务
【发布时间】:2015-08-06 14:00:50
【问题描述】:

我希望实现具有以下功能的服务:

  • 只对给定资源执行一次 HTTP 请求。
  • 提供两个导出函数,每个函数都返回一个承诺,其中承诺是根据来自一次性 HTTP 调用的数据解析的。

这两个函数应存在以提供获取数据的不同表示。

到目前为止我的服务大纲如下:

angular.module('someApp')
.service('someService', function ($http) {

    var httpPromise = $http.get('/some/endpoint/').then(
            function(response) {
                // HTTP response data is processed
            });

    this.getSomePromise = function() {
        // Return a promise which is resolved using one representation of HTTP response
    }

    this.getAnotherPromise = function() {
        // Return a promise which is resolved using another representation of HTTP response
    }

});

如果只需要一个“getter”函数,那么显然我可以简单地返回httpPromise

如图所示,实现接口的适当方法是什么?两个或多个消费者是否可以在同一个承诺上调用.then(),在这种情况下,我只能从两个函数中返回httpPromise.then(function(){...modify data...})?或者,在这种情况下,是否有必要创建一个新的 Promise(使用 $q.defer())并基于保存 HTTP 响应的缓存对象以某种方式解决它?

【问题讨论】:

    标签: angularjs angular-promise


    【解决方案1】:

    您可以使用链接在 http 承诺上简单地创建两个承诺:

    var httpPromise = $http.get('/some/endpoint/');
    
    var firstPromise = httpPromise.then(function(response) {
        return firstTransformation(response.data);
    });
    
    var secondPromise = httpPromise.then(function(response) {
        return secondTransformation(response.data);
    });
    
    this.getSomePromise = function() {
        return firstPromise;
    }
    
    this.getAnotherPromise = function() {
        return secondPromise;
    }
    

    【讨论】:

    • 非常感谢您的回答!我现在要尝试这个,虽然我对它是如何工作的感到困惑。据我了解,这并不是“链接”,因为我们实际上并没有在随后的then() 调用返回的承诺上调用then();相反,我们在给定的 Promise 对象上调用了两次 then()。为此,promise 是否在内部维护要调用的回调列表?
    • 啊!我刚刚浏览了promisesaplus.com 并注意到了这一点:then may be called multiple times on the same promiseIf/when promise is fulfilled, all respective onFulfilled callbacks must execute in the order of their originating calls to then。所以我现在明白,能够使用不同的回调多次调用then() 是承诺合同的一部分。这是关键。除非我掩饰得太多,否则很多文档似乎都没有明确说明这一点。再次感谢您的回答和帮助。
    猜你喜欢
    • 2012-12-25
    • 2017-02-22
    • 2016-03-21
    • 1970-01-01
    • 2014-05-30
    • 2015-11-26
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    相关资源
    最近更新 更多