AngularJS Service在控制器中重复响应

时间:2016-02-24 04:31:32

标签: angularjs angularjs-directive angularjs-ng-repeat

我正在拨打以下服务: 获取帐户详细信息

我的控制器中的第一段代码:

//resp is coming from an $http sync request, above the below request.
    for (var i = 0; i < resp.rows; ++i) { 
         userService.getAccountsBalance($rootScope.userid, resp[i]['Acct_Number']).then(function(data){

                console.log(data.bal) // shows two duplicate balances
            });
    }

在我的服务中:

app.service('userService', function($rootScope, $q){
    var deferred = $q.defer();  


    this.getAccountsBalance = function(userid, accountNum){
        console.log(userid + "    " + accountNum)
        var req = <my $http request>
        req.send().then(function(resp){
            deferred.resolve(resp.responseJSON);        
        }); 

        console.log(deferred.promise) //// prints two balances JSON objects with no duplicate
        return deferred.promise; 
    }
});

我的问题是,我可以看到在我的服务中执行了两个请求(具有不同的参数),并为两个帐户返回两个不同的余额。但是,在我的控制器中,我得到两个重复的结果。我只得到两次最后一次回复。

我很确定这与承诺有关,我还是新人。

4 个答案:

答案 0 :(得分:1)

问题似乎是你要为两个请求返回相同的承诺,

app.service('userService', function($rootScope, $q){

   this.getAccountsBalance = function(userid, accountNum){
        var deferred = $q.defer();

如上所述进行更改,它应该可以正常工作。

答案 1 :(得分:0)

为了遍历promises,你应该使用$ q服务,该服务提供$ .all方法,只允许你解析所有promises,然后获取每个promise的数据

答案 2 :(得分:0)

如果涉及多个承诺,如果有人承诺得到解决,所有承诺将以相同的价值得到解决。

所以你应该使用$q.all()来获得所有承诺的结果。

你可以这样做。

注入$q服务。

var arrAllPromise = [];
for (var i = 0; i < resp.rows; ++i) {
    arrAllPromise[i] = userService.getAccountsBalance($rootScope.userid, resp[i]['Acct_Number'])

}

$q.all(arrAllPromise).then(function(data) {

    console.log(data) // shows two duplicate balances
});

它将提供解析它的所有承诺数据。

答案 3 :(得分:0)

基本上问题是你有一个共同的$ q对象的承诺。当你的第一个承诺得到解决时,外部$ q的承诺通过一些回应得到解决。

然后你有第二次调用相同的函数,它将进行$ http调用但返回旧的已解决的promise。因为旧的$ q对象已经履行了它的承诺。

要解决此问题,您应该在内部方法中使用单独的$ q.defer()。这样每次正确的数据都将通过服务方法返回

您正在使用$ q创建自定义承诺,这被视为错误模式。因为你有$ http.get方法,你可以利用他们的承诺(每个$ http方法承诺,我们可以使用.then链接它们)

服务

app.service('userService', function($rootScope, $q){
    this.getAccountsBalance = function(userid, accountNum){
        var req = <my $http request>
            //utilize promise object returned by $http
        req.send().then(function(resp){
                    //return data that sent to promise chain function
            return resp.data;       
        });
    }
});