2016-12-05 164 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); 
     }) 

    } 

})