2016-02-24 154 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;  
     }); 
    } 
});