如何链接AngularJS中的服务返回的承诺

时间:2016-05-03 11:39:35

标签: angularjs promise

根据最佳实践,我为所有不同的API调用块创建了一个服务,并将该文件称为api.js;

这是一个例子。

api.service('Auth', function(Config, $http, $q, $state) {
 this.login = function(jsonToSend) {
            return $http.post(Config.apiurl + '/user/auth/login', jsonToSend)
                .then(function(response) {
                    return response.data;
                }, function(error) {
                    return $q.reject(error.data);
                });
        };

        // Api function for signing the user up
        this.signup = function(jsonToSend) {
            return $http.post(Config.apiurl + '/user/auth/signup', jsonToSend)
                .then(function(response) {
                    return response.data;
                }, function(response) {
                    return $q.reject(response.data);
                });
        };

});

现在在我的loginController.js中,我将此服务注入其他服务。现在我想要的是。

Auth.Login()
.User.getUser()
.User.getCart()
.Item.getProduct()

我的小孩尝试。我知道这是错的,但社区要求你展示你的所作所为。

var q = $q.defer() //intialize
Auth.login().then(function(response){
//some manipulation and store stuff in data
$q.resolve(data);
  })
.then(function(data){

})

我想像这样链接他们。我知道代表是错误的,但我希望你能理解我在这里要做的事情。

我有另一个选择通过async.js / underscore.js的瀑布方法来做到这一点,但我想提高我对promises的知识,因此想知道这种方法是否可行。 谢谢。

1 个答案:

答案 0 :(得分:1)

你可以像这样保存对vars的承诺:

var loginPromise = Auth.login();
var userPromise = User.getUser();
var chartPromise = User.getCart();
var productPromise = Item.getProduct();

然后你可以等待所有的承诺来解决,并对结果做这样的事情:

$q.all([loginPromise, userPromise , chartPromise , productPromise]).then(function(data){
 /* You can Access each promise data with the index of the order you put them into $q.all(..
  * data[0], data[1], data[2], data[3]
  */
});