Angularjs 角度服务,如何让同时通话等待

Angularjs 角度服务,如何让同时通话等待,angularjs,controller,angular-promise,angular-services,Angularjs,Controller,Angular Promise,Angular Services,我有两个控制器,它们希望在同一时间获得相同的数据,但我不希望数据绑定 因此,我有一个服务来获取具有以下方法的用户数据: var getUserData: function() { if (!angular.isDefined(this.userData)) { return new RESTUtil.getData('userData').then(function(data) { this.userData = data;

我有两个控制器,它们希望在同一时间获得相同的数据,但我不希望数据绑定

因此,我有一个服务来获取具有以下方法的用户数据:

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服务,所以我最终得到了对该服务的两个数据调用

我想我会在控制器B中使用$scope.$on来收听ControllerA的广播,但这会绑定数据

基本上,如果ctrlA.userData=this,我更改ctrlB.userData=this,我不希望两个userData对象绑定,应该实例化它们

关于如何编写服务逻辑的任何建议:a.)在REST调用发生时对getUserData的任何调用都将等待并使用相同的数据调用,或者B.)具有不绑定的广播

我在这里看到一个类似的问题:


但我不确定如何利用$http,因为我实际的webservice调用是在RESTUtil.getData()中抽象的

你就快到了。但是你的服务有一个缺陷。第一次调用时,它会返回一个承诺。但第二次调用时(如果承诺已解决),它不再返回承诺,而是返回已解决的数据

服务应始终返回承诺,并且在第一次调用时应初始化承诺:

var getUserData: function() {
    if (!angular.isDefined(this.userData)) {
        this.userData = RESTUtil.getData('userData');
    } 
    return this.userData;
}
如果希望避免每个调用方从承诺中接收相同的对象,则每次都返回一个新的承诺,该承诺使用原始数据的副本解析:

var getUserData: function() {
    if (!angular.isDefined(this.userData)) {
        this.userData = RESTUtil.getData('userData');
    } 
    return $q.when(this.userData).then(angular.copy);
}

嗨,JB。谢谢你的评论。这无疑解决了承诺问题,但这将约束这两个值。因此,如果this.userData.data.name=“Steve”和我将ctrlA.userData.data.name更改为“Bob”,它将this.userData.data.name更新为Bob,将ctrlB.userData.data.name更新为Bob。我不知道如何以这种方式将服务数据解除绑定到$scope值。这正是我所需要的。再次感谢!