在 Angular 中让多个调用等待同一个承诺
Have multiple calls wait on the same promise in Angular
我在一个页面上有多个控制器使用相同的服务,为了举例,我们将调用服务 USER。
第一次调用 USER.getUser() 时,它会执行 $http 请求以获取用户数据。调用完成后,它将数据存储在 USER.data 中。如果对 USER.getUser() 进行另一个调用,它会检查 USER.data 中是否有数据,如果有数据,它会 returns 而不是进行调用。
我的问题是对 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;
}
}
});
我希望我的问题是有道理的。任何帮助将不胜感激。
这对你有用吗?
.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;
}
}
})
$http
已经 returns 给你的承诺,甚至更多,有两种有用的类型:成功和错误。所以基本上,@kfis 提供的选项不会捕获错误并且不灵活。
你可以写一些简单的东西:
.factory('user', function($http) {
return {
getUser: function() {
$http.get('/my/url/')
.success(function(data) {
return data;
})
.error(function(err) {
// error handler
})
}
}
})
我在一个页面上有多个控制器使用相同的服务,为了举例,我们将调用服务 USER。
第一次调用 USER.getUser() 时,它会执行 $http 请求以获取用户数据。调用完成后,它将数据存储在 USER.data 中。如果对 USER.getUser() 进行另一个调用,它会检查 USER.data 中是否有数据,如果有数据,它会 returns 而不是进行调用。
我的问题是对 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;
}
}
});
我希望我的问题是有道理的。任何帮助将不胜感激。
这对你有用吗?
.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;
}
}
})
$http
已经 returns 给你的承诺,甚至更多,有两种有用的类型:成功和错误。所以基本上,@kfis 提供的选项不会捕获错误并且不灵活。
你可以写一些简单的东西:
.factory('user', function($http) {
return {
getUser: function() {
$http.get('/my/url/')
.success(function(data) {
return data;
})
.error(function(err) {
// error handler
})
}
}
})