2016-02-24 115 views
1

我打电话以下服务响应: 获取账户信息AngularJS服务复制在控制器

在我的控制器

第一段代码:

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

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

我很确定它与承诺有关,而且我还是新手。

回答

0

为了遍历的承诺,你应该使用$ Q服务,提供$。所有方法,可以让你只解决在所有的承诺已得到解决,然后获取数据的每个承诺

+0

谢谢,但我m在控制器中执行循环,控制器调用服务功能两次。 – Sobiaholic

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

它将给出解决它的所有承诺数据。

1

这个问题似乎是你正在返回两个请求同样的承诺,

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

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

更改它像上面,它应该工作。

+0

你的回答很好,但没有解释幕后发生的事情。这就是为什么用建议和解释添加答案的原因。谢谢 ;-) –

0

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

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

为了解决这个问题,你应该有单独的$ q.defer()方法。因此,每次正确的数据将通过服务方法返回

您正在使用$ q创建自定义承诺,这被认为是不良模式。当你有$ http.get方法本身就存在的地方,你可以利用自己的承诺(各$ HTTP方法的承诺,我们可以使用它们。然后链)

服务

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