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);
}