我有几个服务通过对象上的标志返回相同类型的对象,只是一个不同的类型。这些服务具有返回承诺的功能。
服务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。
我会更多地研究这个问题,但如果我能够了解我写的是否正确将会很好。感谢。
答案 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
使用基于承诺的响应解析。