同步DB请求节点JS ORM

问题描述:

我需要从数据库填充值的数组,然后才返回,所以我怎么能做出这种同步同步DB请求节点JS ORM

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); 
+0

node.js不能像那样工作。如果你想要看起来同步的东西,可以使用生成器,一种编译为异步JavaScript的语言或类似的东西。节点的一大卖点之一是I/O是异步的。 – mscdex

什么是你正在尝试做的背景?您不能使异步操作同步。相反,您必须调用另一个函数来告诉程序异步操作已完成。例如,如果您要响应客户端请求,则可以在完成结果后发送回调中的响应,例如, response.send(result);否则,您可能会调用一个done()函数或一些类似的函数来传递结果。

为了在代码中表示最终结果,并且从嵌套的回调中释放自己,请查看用Promise替换回调函数。例如

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 
})