在Angular工厂中完成多个http方法时的功能

时间:2016-02-04 17:16:44

标签: angularjs

我目前有一家工厂提交带有数据的POST请求。

这是工厂:

app.factory('Quotes', ['$http',function($http, $q) {

  var urlBase = 'http://test-url.com';
  var Quotes = {};

  Quotes.createQuote = function (data) {
    return $http.post(urlBase + '/', data)
  };

  return Quotes;
}]);

我有一个对象数组,每个对象需要在它自己的POST请求中单独提交。我有这个控制器..

我将$ scope.array传递给saveQuote()函数。

$scope.saveQuote = function(data){
    $rootScope.loading = true;

    angular.forEach(data, function(quote){

      Quotes.createQuote(quote)
        .success(function (data, status, headers, config) {
            $rootScope.loading = false;
            $rootScope.status = {header: "Success", message: "Success", type: "success"};
        })
        .error(function (data, status, headers, config) {
            $rootScope.status = {header: "Error", message: data};
        });         
    });
}  

如何在所有帖子请求完成后创建一个函数?

更新

另外,我如何为每个POST输出每个错误响应?看来下面的答案只输出其中一个?

1 个答案:

答案 0 :(得分:3)

使用$ q服务

$scope.saveQuote = function(data){
    $rootScope.loading = true;
    var createdQuotes = [];

    angular.forEach(data, function(quote){
      createdQuotes.push(Quotes.createQuote(quote));         
    });

    $q.all(createdQuotes).then(function() {
       //do something now that all the quotes are created

       $rootScope.loading = false;
       $rootScope.status = {header: "Success", message: "Success", type: "success"};
    }, function(data) {
       $rootScope.status = {header: "Error", message: data};
    });
}

Quote.createQuote必须返回承诺才能使其发挥作用。

更好的是,您可以将forEach更改为map,将第一部分缩减为一行,如下所示:

var createdQuotes = data.map(Quotes.createQuote);