2016-04-03 2 views
0

Ich muss mit Werten aus DB-Array füllen und erst dann zurückkehren, so wie kann ich diese Synchron machenSynchrone DB fordert Knoten 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 funktioniert nicht so. Wenn Sie etwas suchen möchten, das synchron aussieht, verwenden Sie Generatoren, eine Sprache, die zu asynchronem JavaScript kompiliert wird, oder etwas Ähnliches. Einer der großen Vorteile von Knoten ist, dass I/O asynchron ist. – mscdex

Antwort

0

Was ist der Kontext für das, was Sie zu tun versuchen? Sie können asynchrone Vorgänge nicht synchron ausführen. Stattdessen müssen Sie eine andere Funktion aufrufen, um Ihrem Programm mitzuteilen, dass die asynchrone Operation abgeschlossen ist.

Wenn Sie beispielsweise auf eine Clientanforderung antworten, können Sie die Antwort innerhalb Ihres Rückrufs senden, sobald Sie das vollständige Ergebnis, z. response.send(result); Sonst könnten Sie eine done() Funktion oder eine ähnliche Funktion aufrufen, um das Ergebnis weiterzugeben.

Um das eventuelle Ergebnis in Ihrem Code darzustellen und sich auch von verschachtelten Callbacks zu befreien, sehen Sie sich an, dass Sie Ihre Callback-Funktionen durch Promises ersetzen. z.B.

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