繁体   English   中英

管理angularjs嵌套的Promise可从服务器返回响应

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM