2017-12-26 32 views
1

노드 js가 비동기이며이 문제를 해결하기 위해 많은 리소스를 보았습니다. 내 문제는, 나는이 mongodb 쿼리를 실행 해요,하지만 쿼리가 끝나기 전에 내 함수가 반환 약속에 대해 알고 있고 그들을 사용하고 있지만 작동하지 않는, 내가 뭘 잘못하고있다.코드에서 노드 js에서 함수 반환을 기다리는 방법

function findConversation(Id){ 
 
    return new Promise(function(resolve, reject){ 
 
    ConversationSchema.find({ 'participants.Id': Id }, function (err, conversations) { 
 
     if (err) return reject(err); 
 
     if (conversations) { 
 
     console.log("Conversation JSON: " + conversations) 
 
     } 
 
     resolve(conversations) 
 
    }) 
 
\t }) 
 
}

이 내가 실행 해요 쿼리이지만,이 울부 짖는 소리 함수라고 : 내 코드는 아래에서 확인할 수 있습니다

function getConversations(user){ 
 
\t var newConversations = [] 
 

 
\t query.findConversation(user.userName).then(function(convers) { 
 
\t \t if(convers) { 
 
\t \t \t console.log("conversation was found: " + convers) 
 
\t \t \t newConversations = convers 
 
\t \t } 
 
\t \t else { 
 
\t \t \t console.log("conversation was not found: " + convers) 
 
\t \t } 
 
\t }).catch(function(reason) { 
 
\t \t console.log("failure when finding conversation: " + reason) 
 
\t }) 
 
\t return newConversations 
 
}

위의 함수는 약속을 기다리지 않고 반환하는 함수입니다. L이 기능 :

socket.on(VERIFY_USER, (nickname, callback)=>{ 
 

 
    query.userExist(nickname).then(function(user){ 
 
     if(user){ 
 
     console.log("user exist") 
 

 
     var conversation = factories.getConversations(user) 
 
     console.log("Existing user Conversations: " + conversation) 
 
     callback({ userExist:true, user:factories.getUser(user, socket.id), conversations: conversation}) 
 
     } 
 
     else { 
 
     console.log("user does not exist") 
 
     callback({ userExist:false, user:factories.createUser(nickname, socket.id), conversations:[]}) 
 
     } 
 
    }).catch(function(reason) { 
 
     console.error(reason); 
 
    }) 
 
\t })
이 항상 기존 사용자 대화를 반환

+0

약속은 쿼리의 반환을 기다리지 않기 때문에 그래, 나는 또한 동일한 문제 ...와 싸우고있다 –

답변

1

약속을 사용할 때 코드를 통해이를 사용한다는 것을 기억하십시오. 올바르게 리턴하기 위해서는 비동기 함수가 필요한 것도 비동기 적이어야합니다. 이 실행되기 전에 query이 완료되지 않는다는 것을 알고 계시고, 은 쿼리 완료를 위해을 기다리지 않습니다.

따라서 여기 getConversations은 새로운 약속이있는 findConversation과 같은 구조이어야하고 resolve(newConversations)을 호출해야합니다. 전화를 걸었을 때와 마찬가지로 .then을 사용합니다.

factories.getConversations(user).then((conversation) => { 
    console.log("Existing user Conversations: " + conversation); 
    callback({userExist: true, user: factories.getUser(user, socket.id), conversations: conversation}); 
}); 

당신이 약속이 너무 어렵거나 지저분한 사용하여 찾아 당신은 아마 async/await를 사용해야합니다 당신이 ES6을 사용할 수있는 경우. 이렇게하면 코드가 동기식이지만 아직 블로킹되지 않은 것처럼 코드를 작성할 수 있습니다. getConversations 비동기 함수 인 경우, 예를 들어, 당신은 매우 간단하게 사용할 수있을 것입니다 :

let conversation = await factories.getConversations(user); 
console.log("Existing user Conversations: " + conversation); 
callback({userExist: true, user: factories.getUser(user, socket.id), conversations: conversation}); 

점수는 당신이 약속이 어떻게 작동하는지 검토하거나 정말 비동기/작품을 기다리고 방법을 시도해야합니다.

편집 : Related question