我正在拨打以下服务: 获取帐户详细信息
我的控制器中的第一段代码:
//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 :(得分: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;
});
}
});