如何在我的情况下发出多个http请求?

时间:2014-10-29 00:47:15

标签: javascript angularjs promise

我正在尝试使用工厂对象来发出多个http请求。我有类似

的东西
angular.module('App').factory('myFactory', function($http, $q) {
    var service = {};

    service.setProduct = function(productObj) {
        _productObj = productObj;
    }

    service.makeRequest = function() {
        var deferred = $q.defer();

        $http.post('/api/product', _productObj).success(function(data){
            var id = data.id
            //I am not sure how to chain multiple calls by using promise.
            //$http.post('/api/details/, id).success(function(data) {
            //    console.log(data)
            //}
            deferred.resolve(data);
        }).error(function() {
            deferred.reject('error here');
        })
        return deferred.promise;
    }
    return service;
});







angular.module('App').controller('productCtrl', ['$scope','$http','myFactory',
    function($scope, $http, myFactory) {
        myFactory.setProduct(productObj);
        myFactory.makeRequest()
            .then(function(data) {
               console.log(data) 
            }, function(data) {
               alert(data)
            })

    }
]);

我能够使用myfactory.makeRequest()进行一次调用但不知道如何链接多个http请求。有人可以帮帮我吗?谢谢!

2 个答案:

答案 0 :(得分:2)

如果您需要发出顺序请求,那么您需要链接承诺。您甚至不需要创建自己的deferred对象 - $http.post已经返回了一个承诺,因此您只能.then它。

return $http.get("url1")
   .then(function(response){

     var nextUrl = response.data;
     return $http.get(nextUrl);
   })
   .then(function(response){

     var nextUrl = response.data;
     return $http.get(nextUrl);
   })
   .then(function(response){

     return response.data;
   });

.success用于更传统的非承诺方法

这里是plunker

答案 1 :(得分:0)

对承诺做一些阅读。请记住JS在异步中。您需要在回调中进行下一次服务器调用(第一个.then函数)。