2016-04-03 152 views
0

我需要從數據庫填充值的數組,然後才返回,所以我怎麼能做出這種同步同步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

回答

0

什麼是你正在嘗試做的背景?您不能使異步操作同步。相反,您必須調用另一個函數來告訴程序異步操作已完成。例如,如果您要響應客戶端請求,則可以在完成結果後發送回調中的響應,例如, 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 
})