javascript - Managing angularjs nested promises to build response back from the server -
im building response server using angular in order show private messages. far have code works fine doesnt using promises correct way, specially handling errors. im wondering how im suppose handle nested promises in case using best practices?
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); } }) }); };
you sender data @ same time getting receiver data. shouldn't nest 2 promises contextually independent it'd result in poor user experience, because you're waiting "sender" response ends issue request gets "receiver" data, while browser deal 2 requests @ same time.
you should issue 2 requests @ same time , wait both deal related data. this:
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); } }); }) }); or option if believe it's more readable:
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); } }); }) });
Comments
Post a Comment