2016-04-03 16 views
0
私はDBからの値を持つ配列を移入する必要があるだけにしてそれを返す

を要求するので、どのように私は作ることができ、この同期同期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などのコンパイル言語を使用してください。ノードの大きなセールスポイントの1つは、I/Oが非同期であることです。 – mscdex

答えて

0

あなたがやろうとしている何のためのコンテキストとは何ですか?非同期操作を同期させることはできません。代わりに、非同期操作が完了したことをプログラムに伝える別の関数を呼び出す必要があります。

たとえば、クライアントリクエストに応答する場合、完全な結果が得られれば、コールバック内から応答を送信できます。 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 
}) 
関連する問題