多个 http 请求 AngularJS



我分多个步骤使用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);
});

希望有帮助。

最新更新