![](/img/trans.png)
[英]Managing service callbacks from controller using promises in AngularJS?
[英]Managing angularjs nested promises to build response back from the server
我使用angular从服务器返回一个响应,以显示私人消息。 到目前为止,我有这段代码可以正常工作,但看起来不像使用promises正确的方法,特别是用于处理错误。 我想知道如何在这种情况下使用最佳实践来处理嵌套的Promise?
function listenMessageSend(data) {
var imData = {
message: data.data.id,
sender: currentUser().id,
reciever: $scope.reciever
}
Im.create(imData).then(function(im) {
Message.update(im.data.message, {im: im.data.id}).then(function(msg) {
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;
});
});
if (msg.data.im.sender === currentUser().id || msg.data.im.reciever === currentUser().id) {
$scope.messages.push(msg.data);
}
})
});
};
您可以在获取接收方数据的同时获取发送方数据。 您不应该嵌套两个上下文无关的promise,因为这会导致糟糕的用户体验,因为您正在等待“ sender”响应结束以发出获取“ receiver”数据的请求,而浏览器却可以完美处理同时处理两个请求。
您应该同时发出两个请求,并等待两者处理相关数据。 像这样:
Im.create(imData).then(function(im) {
Message.update(im.data.message, {im: im.data.id}).then(function(msg) {
var senderGet = User.get(msg.data.im.sender).then(function(sender) {
msg.data.im.sender = sender.data;
});
var receiverGet = User.get(msg.data.im.reciever).then(function(reciever) {
msg.data.im.reciever = reciever.data;
});
$q.all([senderGet, receiverGet]).then(function() {
if (msg.data.im.sender === currentUser().id || msg.data.im.reciever === currentUser().id) {
$scope.messages.push(msg.data);
}
});
})
});
或者,如果您认为它更具可读性,则可以选择另一个方法:
Im.create(imData).then(function(im) {
Message.update(im.data.message, {im: im.data.id}).then(function(msg) {
var senderGet = User.get(msg.data.im.sender);
var receiverGet = User.get(msg.data.im.reciever);
$q.all([senderGet, receiverGet]).then(function(response) {
msg.data.im.sender = response[0].data;
msg.data.im.reciever = response[1].data;
if (msg.data.im.sender === currentUser().id || msg.data.im.reciever === currentUser().id) {
$scope.messages.push(msg.data);
}
});
})
});
if
必须留在更深层次的内部,因为它将最终解决:
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;
if (msg.data.im.sender === currentUser().id || msg.data.im.reciever === currentUser().id) {
$scope.messages.push(msg.data);
}
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.