有多个调用等待Angular中的同一个promise

时间:2015-04-02 19:39:55

标签: angularjs rest angular-promise

我在页面上有多个使用相同服务的控制器,为了举例我们将调用服务USER。

第一次调用USER.getUser()时,它会对用户的GET数据执行$ http请求。调用完成后,它将数据存储在USER.data中。如果对USER.getUser()进行另一次调用,它会检查USER.data中是否有数据,如果有数据,则返回该数据,而不是进行调用。

我的问题是对USER.getUser()的调用发生得太快,以至于USER.data没有任何数据,所以它再次触发$ http调用。

以下是我现在为用户工厂提供的内容:

.factory("user", function($http, $q){
    return {
        getUser: function(){
            var that = this;
            var deferred = $q.defer();
            if(that.data){
                deferred.resolve(that.data);
            } else {
                $http.get("/my/url")
                .success(function(res){
                    that.data = res;
                    deferred.resolve(that.data);
                });
            }
            return deferred.promise;
        }
    }
});

我希望我的问题有道理。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:10)

这对你有用吗?

.factory("user", function($http, $q) {
        var userPromise;

        return {
            getUser: function () {
                if (userPromise) {
                    return userPromise;
                }

                userPromise = $http
                    .get("/my/url")
                    .then(function(res) {
                        return res.data;
                    });

                return userPromise;
            }
        }
    })

答案 1 :(得分:1)

$http已经为您回复了承诺,甚至更多,有两种类型:成功&错误。所以基本上,@ kfis提供的选项不会捕获错误而且不灵活。 你可以写一些简单的东西:

.factory('user', function($http) {
    return {
       getUser: function() {
          $http.get('/my/url/')
             .success(function(data) {
                return data;
             })
             .error(function(err) {
                // error handler
             })
       }
    }
})