【问题标题】:Synchronous DB requests Node JS ORM同步 DB 请求 Node JS ORM
【发布时间】:2016-04-04 03:53:13
【问题描述】:

我需要用数据库中的值填充数组,然后才返回它,那么我怎样才能使这个同步

   var convs = Array;
    User.find({token: token}).first(function(err, user) {
          ConversationData.find({user_id: 1}).each().forEach(function(convData) {
            ConversationData.count({conversation_id: convData.conversation_id}, function(err, count) {
              if(count == 2) {
                var user2;
                console.log(convData.user_id);
                ConversationData.find({user_id: 2, conversation_id: convData.conversation_id}).first(function(err, usr) {
                  user2 = usr;
                });
                Message.find({conversation: convData.conversation_id}, [ "createdAt", "Z" ]).first(function(err, msg){
                  convs[convData.id].conversation = convData.id;
                  convs[convData.id].lastMessage = msg.content;
                  convs[convData.id].lastMessageDate = msg.createdAt;
                  convs[convData.id].title = user2.name + " " + user2.name;
                  convs[convData.id].avatar = user2.avatar;
                });
              } else {
                console.log('COUNT = ' + count);
              }
            });
          });
console.log(convs);

【问题讨论】:

  • node.js 不能那样工作。如果您想要看起来同步的东西,请使用生成器、编译为异步 javascript 的语言或类似的东西。 node 的一大卖点是 i/o 是异步的。

标签: javascript node.js postgresql node-orm2


【解决方案1】:

您尝试做的事情的背景是什么?您不能使异步操作同步。相反,您必须调用另一个函数来告诉您的程序异步操作已完成。

例如,如果您正在响应客户端请求,则可以在获得完整结果后从回调中发送响应,例如response.send(result); 否则,您可能会调用 done() 函数或一些类似的函数来传递结果。

要在您的代码中表示最终结果,并让您摆脱嵌套回调,请考虑用 Promises 替换您的回调函数。例如

return User.find({token: token}).then(function(userData){
    return Conversation.find({id: userData.id});
}).then(function(conversationData){
    return Message.find({conv_id: conversationData.id}); //or response.send(conversationData) etc
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 2013-03-10
    • 1970-01-01
    • 2020-12-05
    • 2017-06-01
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多