Angular服务,如何让同时呼叫等待
Angular service, how to have simultaneous calls wait
我有两个控制器几乎同时需要相同的数据,但我不想绑定数据。
所以我有一个服务去获取具有这种方法的用户数据:
var getUserData: function() {
if (!angular.isDefined(this.userData)) {
return new RESTUtil.getData('userData').then(function(data) {
this.userData = data;
return this.userData
})
} else {
return this.userData
}
}
然后我有两个控制器为不同的目的提取数据:
controller('ControllerA', ['$scope', '$rootScope', 'DataService'], function($scope, $rootScope, DataService) {
var ctrlA = this;
DataService.getUserData().then(function(data) {
ctrlA.userData = data;
});
});
controller('ControllerB', ['$scope', '$rootScope', 'DataService'], function($scope, $rootScope, DataService) {
var ctrlB = this;
DataService.getUserData().then(function(data) {
ctrlB.userData = data;
});
});
所以我目前所写的问题是 ControllerA 和 ControllerB 在 RESTUtil 调用之前都命中了 getUserData 服务 returns,所以我最终收到了对该服务的两次数据调用。
我想我会在 Controller B 中使用 $scope.$on 来收听来自 ControllerA 的广播,但这会绑定数据。
基本上如果 ctrlA.userData = this 并且我更改 ctrlB.userData = that,我不希望这两个 userData 对象绑定,它们应该被实例化。
关于我如何做的任何建议 a.) 编写我的服务逻辑,在 REST 调用发生时对 getUserData 的任何调用都将等待并使用相同的数据调用,或者 B.) 有一个不存在的广播绑定?
我在这里看到了类似的问题:
但我不确定如何利用 $http,因为我的实际 Web 服务调用是在 RESTUtil.getData();
中抽象的
你快到了。但是你的服务有缺陷。第一次调用时,它 return 是一个承诺。但它第二次被调用时(如果承诺已解决),它不再是 return 承诺,而是已解决的数据。
服务应该总是return一个承诺,并且它应该在第一次调用时初始化承诺:
var getUserData: function() {
if (!angular.isDefined(this.userData)) {
this.userData = RESTUtil.getData('userData');
}
return this.userData;
}
如果你想避免每个调用者从承诺中接收相同的对象,那么每次 return 一个新的承诺,用原始数据的副本解决:
var getUserData: function() {
if (!angular.isDefined(this.userData)) {
this.userData = RESTUtil.getData('userData');
}
return $q.when(this.userData).then(angular.copy);
}
我有两个控制器几乎同时需要相同的数据,但我不想绑定数据。
所以我有一个服务去获取具有这种方法的用户数据:
var getUserData: function() {
if (!angular.isDefined(this.userData)) {
return new RESTUtil.getData('userData').then(function(data) {
this.userData = data;
return this.userData
})
} else {
return this.userData
}
}
然后我有两个控制器为不同的目的提取数据:
controller('ControllerA', ['$scope', '$rootScope', 'DataService'], function($scope, $rootScope, DataService) {
var ctrlA = this;
DataService.getUserData().then(function(data) {
ctrlA.userData = data;
});
});
controller('ControllerB', ['$scope', '$rootScope', 'DataService'], function($scope, $rootScope, DataService) {
var ctrlB = this;
DataService.getUserData().then(function(data) {
ctrlB.userData = data;
});
});
所以我目前所写的问题是 ControllerA 和 ControllerB 在 RESTUtil 调用之前都命中了 getUserData 服务 returns,所以我最终收到了对该服务的两次数据调用。
我想我会在 Controller B 中使用 $scope.$on 来收听来自 ControllerA 的广播,但这会绑定数据。
基本上如果 ctrlA.userData = this 并且我更改 ctrlB.userData = that,我不希望这两个 userData 对象绑定,它们应该被实例化。
关于我如何做的任何建议 a.) 编写我的服务逻辑,在 REST 调用发生时对 getUserData 的任何调用都将等待并使用相同的数据调用,或者 B.) 有一个不存在的广播绑定?
我在这里看到了类似的问题:
但我不确定如何利用 $http,因为我的实际 Web 服务调用是在 RESTUtil.getData();
中抽象的你快到了。但是你的服务有缺陷。第一次调用时,它 return 是一个承诺。但它第二次被调用时(如果承诺已解决),它不再是 return 承诺,而是已解决的数据。
服务应该总是return一个承诺,并且它应该在第一次调用时初始化承诺:
var getUserData: function() {
if (!angular.isDefined(this.userData)) {
this.userData = RESTUtil.getData('userData');
}
return this.userData;
}
如果你想避免每个调用者从承诺中接收相同的对象,那么每次 return 一个新的承诺,用原始数据的副本解决:
var getUserData: function() {
if (!angular.isDefined(this.userData)) {
this.userData = RESTUtil.getData('userData');
}
return $q.when(this.userData).then(angular.copy);
}