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

Popular posts from this blog

python - Mongodb How to add addtional information when aggregating? -

java - Spring Data JPA: Why findOne(id) executing delete query internally? -

java - Incorrect order of records in M-M relationship in hibernate -