2016-12-05 193 views
0

我有一個嵌套承諾和一個承諾取決於另一個的結果,所以有可能強迫Angular.js解決之前解決gien的承諾第二。等待要解決的承諾,以解決在Angular.js中的另一個承諾

這裏是我的代碼:

User.getAllUsers().then(function(users) { 
    $scope.users = users; 
    for (var i = 0; i < users.length; i++) { 
     console.log('username ' + users[i].username); 
     Message.getUnreadMessages(users[i].username, localStorage.getItem("token")).then(function(messages) { 
      console.log('username in second promise' + users[i].username); 
      $scope.messages.push(messages); 
     }) 
    } 
}) 

用戶和消息都是服務。 console.log('username '+ users[i].username);顯示正確的用戶名。 的console.log('username in second promise'+ users[i].username);投error`:

無法讀取的不確定

+0

你應該考慮創建一個封閉。 –

+0

什麼是封閉你可以給我更多的信息.​​. –

回答

1

財產 '用戶名' 試試這個:

User.getAllUsers().then(function(users) { 
    $scope.users = users; 
    for (var i = 0; i < users.length; i++) { 
     (function(user){ 
     console.log('username ' + user.username); 
     Message.getUnreadMessages(user.username, localStorage.getItem("token")).then(function(messages) { 
      console.log('username in second promise' + user.username); 
      $scope.messages.push(messages); 
     }) 
     })(users[i]); 
    } 
}) 

https://developer.mozilla.org/en/docs/Web/JavaScript/Closures,章關於關閉和循環。

+0

謝謝你的作品 –

+0

高興地幫助你!你能接受答案嗎? – Thierry

0

您應該致電$scope.users = users.data,因爲當您使用then處理承諾時,您得到的是服務器response標準對象。如果你會使用success處理的承諾,那麼你可以不喜歡它$scope.users = users的兩種可能的解決(你現在正在做的方式。):

解決方案1 ​​

User.getAllUsers().then(function(users){ 

    $scope.users=users.data; //instead of users 
    for (var i=0; i<users.length; i++) { 
     console.log('username '+ users[i].username); 
     Message.getUnreadMessages(users[i].username,localStorage.getItem("token")).then(function(messages){ 
     console.log('username in second promise'+ users[i].username); 
     $scope.messages.push(messages); 
     }) 

    } 

}) 

解決方案2

User.getAllUsers().success(function(users){ //instead of then 

    $scope.users=users; 
    for (var i=0; i<users.length; i++) { 
     console.log('username '+ users[i].username); 
     Message.getUnreadMessages(users[i].username,localStorage.getItem("token")).then(function(messages){ 
     console.log('username in second promise'+ users[i].username); 
     $scope.messages.push(messages); 
     }) 

    } 

})