2015-04-27 217 views
2

所以我有这个功能,我需要结合多个承诺响应,但一些阅读后,我意识到承诺是异步,所以在这种情况下,我的循环将完成之前所有的答复做。我应该在这种情况下需要使用$ q.all这样的东西吗?我该如何改进这段代码?谢谢..循环完成之前所有的承诺响应做

$scope.messages = []; 

function getPastMessages(data) { 
    angular.forEach(data, function(item) {    
    Message.get(item.id).then(function(msg) { 
     if (msg.data.is_private === false) { 
     User.getPictures(msg.data.user.id).then(function(pics) { 
      msg.data.user.pictures = pics.data; 
     }); 
     } else { 
     User.get(msg.data.im.sender).then(function(sender) { 
      msg.data.im.sender = sender.data; 
      User.get(msg.data.im.reciever).then(function(reciever) { 
      msg.data.im.reciever = reciever.data; 
      });      
     }); 
     } 
     console.log(msg.data); // SHOW 4 OBJECTS CORRECT 
     $scope.messages.push(msg.data); 
     console.log($scope.messages); // SHOW ARRAY OF 6 OBJECTS ???????? 
    }) 
    }); 
}; 

回答

0

没有一个工作的例子,很难完全理解你的代码的上下文,但你可以做类似的事情。

基本想法是创建一个需要等待的承诺列表。此列表中的每个承诺都应返回一个结果(大概msg.data)。使用$q.all,您会在最后得到一份结果列表(每个承诺一份)。请注意,在.then中返回的东西如果还没有承诺,就会被承诺包裹。

$scope.messages = []; 

function getPastMessages(data) { 
    var promises = []; 
    angular.forEach(data, function(item) {    
    promises.push(getMessage(item)); 
    }); 
    return $q.all(promises); 
} 

function getMessage(item) { 
    return Message.get(item.id).then(function(msg) { 
    if (msg.data.is_private === false) { 
     return User.getPictures(msg.data.user.id).then(function(pics) { 
     msg.data.user.pictures = pics.data; 
     return msg.data; 
     }); 
    } else { 
     return User.get(msg.data.im.sender).then(function(sender) { 
     msg.data.im.sender = sender.data; 
     return User.get(msg.data.im.reciever).then(function(reciever) { 
      msg.data.im.reciever = reciever.data; 
      return msg.data; 
     });      
     }); 
    } 
    }); 
} 

用法:

getPastMessages(data).then(function(results) { 
    for (var i = 0; i < results.length; i++) { 
    $scope.messages.push(results[i]); 
    } 
}); 
+0

这工作得很好!谢谢! –

1

只能靠承诺当你在里面的回调函数已经解决。

var messages = []; 
somethingAsync().then(function(data){ 
    messages.push(data); 
}); 
console.log(messages.length) 

可能返回01取决于长somethingAsync如何进行;你不能依靠它完成。

相反,你应该从做你的调试中回调函数:

var messages = []; 
somethingAsync().then(function(data){ 
    messages.push(data); 
    console.log(messages.length) 
}); 

这将始终返回1