Angular - 多个承诺包含在一个承诺中

时间:2015-04-27 09:28:14

标签: javascript angularjs angular-promise

我有几个服务通过对象上的标志返回相同类型的对象,只是一个不同的类型。这些服务具有返回承诺的功能。

服务1 - getPlaces:

this.getPlaces = function () {
            return $http.get('http://somewhere.com').then(function (response) {
                    return response;
     }).catch(exception.catcher('Something went wrong'));
};

服务2 - getPlaces:

this.getPlaces = function () {
            return $http.get('http://somewhere.com/').then(function (response) {
                    return response;
     }).catch(exception.catcher('Something went wrong'));
};

我还有一个包装器服务,它调用这两个服务,我不希望服务包装器中的函数返回组合结果,直到promises完全执行并返回结果(或null)。我现在正以下列方式做这件事:

    this.getCombinedResults = function () {
        var combined= [];

        var apiCalls = [service1.getPlaces(), service2.getPlaces()];

        $q.all(apiCalls.map(function(call) {
            return call;
        })).then(function (response) {
            angular.forEach(response, function (item, index) {
                combined.push(item);
            });
        });            
        return combined;
    };

这是在承诺中包含多个承诺的正确方法吗?如果不是应该改变什么。我认为它没有正常工作,特别是在我的包装服务中。调用包装器服务函数时,它返回null。

我会更多地研究这个问题,但如果我能够了解我写的是否正确将会很好。感谢。

1 个答案:

答案 0 :(得分:2)

由于getCombinedResults正在调用基于承诺的服务,因此该服务也应返回一个承诺,否则合并将始终为空。

只做

 return $q.all(apiCalls.map(function(call) {
            return call;
        })).then(function (response) {
            angular.forEach(response, function (item, index) {
                combined.push(item);
            });
            return combined;
        }); 

因为then也会返回一个promise,所以此代码会将一个promise返回给调用者。

已解决的值为combined

同样在调用代码中,您需要使用then使用基于承诺的响应解析。