我分多个步骤使用RESTful服务。
首先,我发送一个 GET 请求并接收一个 URI 列表,然后在 for-each 循环中遵循该列表进行第二次 REST 调用。
var deferred = $q.defer();
var results = [];
APICall.getAllObjects(id).then(function(data){
angular.forEach(data.data, function( value, key){
APICall.getIndiviualObject(value).then(function(result)
{
results.push(result); //put Indiviual Objects in Array
deferred.resolve({objects: result});
});
});
});
return deferred.promise;
不幸的是,这只返回一个元素,即使返回了多个对象。我不知道如何解决这个问题 - 授予承诺对我来说相对较新......
关于如何使它成为正确的异步调用的任何想法?
我会试试这个。收集你所有的承诺,然后等到它们全部完成。
var deferred = $q.defer();
var results = [];
APICall.getAllObjects(id).then(function(data){
var promises = [];
angular.forEach(data.data, function( value, key){
promises.push(APICall.getIndiviualObject(value).$promise);
});
$q.all(promises).then(function(results) {
// here you should have all your Individual Object list in `results`
deferred.resolve({objects: results});
});
});
return deferred.promise;
让我知道它的工作是否:)
假设你的APICall.getIndividualObject
只使用第一个值,你应该能够像这样定义你的主要 getter:
var getAllById = function(id) {
return APICall.getAllObjects(id).then(function(ids) {
return $q.all(ids.map(APICall.getIndividualObject));
});
};
那么,它到底做了什么呢?
在.then
中返回Promise
仍然有资格作为Promise
。$q.all
也是如此,只需返回一个Promise
即可获得Array
结果。
(有关链接的详细信息,请参阅 https://github.com/kriskowal/q#chaining)
这允许您使用getAllById
就像您最初想要使用的承诺一样:
getAllById(1337).then(function(results) {
console.log('It worked!', results);
}, function(err) {
console.error('Something bad happened!', err);
});
希望有帮助。