2017-09-27 3 views
5

Node.js의 async/await 기능으로 몽구스 약속을 사용하려고합니다. 내 함수 printEmployees이 호출되면 orderEmployees 함수에 의해 쿼리 된 직원 목록을 저장하려고합니다. console.log 문 내에서 orderEmployees이 예상 쿼리를 반환하는 동안 printEmployeesconsole.logundefined을 반환하므로 약속이 올바르게 반환되지는 않습니다.async/await와 몽구스 약속 사용

전 완전히 패러다임을 이해하지 못하고 있다는 것을 전적으로 약속 했으므로 새로운 도움이됩니다.

printEmployees: async(company) => { 
    var employees = await self.orderEmployees(company); 
    // SECOND CONSOLE.LOG 
    console.log(employees); 
    }, 

    orderEmployees: (companyID) => { 
    User.find({company:companyID}) 
    .exec() 
    .then((employees) => { 
     // FIRST CONSOLE.LOG 
     console.log(employees); 
     return employees; 
    }) 
    .catch((err) => { 
     return 'error occured'; 
    }); 
    }, 

답변

3

당신은 그렇지 않으면 당신은 await은 본질적으로 아무것도/undefined을 반환하는 함수에 보내고있다, 당신의 Promisereturn해야합니다.

orderEmployees: (companyID) => { 
    return User.find({ company:companyID }).exec() 
} 
2

당신은 반환 할 필요가 Promise

orderEmployees: companyId => User.find({ companyId }).exec() 

당신은 당신이 다음 반환하기 전에 코드를 유지할 수있는 몇 가지 오류 처리 또는 사전 처리를 할 수 있지만 단지 반환 기억하고 싶은 경우 orderEmployees에서 그 결과 (약속은 연쇄 적이다).

+0

[명백한 약속 생성 반 패턴] (https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-iavoid) -it) 오류 처리에 도움이됩니다. 이점은 무엇입니까? 당신은 단순한 비동기 함수에서'return employees'와'throw e'를 사용할 수 있습니다. –

+0

@TamasHegedus 예 좋은 지적, 노드가 내부의 약속에서 예외를 던지기를 처리하지 못한 시대의 오래된 습관! – James

4

orderEmployees에서 Promise를 반환하지 않습니다.

6

orderEmployees을 비동기 함수처럼 동작 시키려면 결과를 반환해야합니다.

  1. 당신이 (비동기 함수에 의해 반환 예를 들어) 당신도 .then를 호출해야 약속이 있다면 그것은 Promise
  2. 을 반환하는 경우 함수가 비동기 : 약속을 사용할 때 async/await 키워드없이 따라 두 가지 규칙이 있습니다 그것에 또는 그것을 돌려 보내십시오.

당신이 다음 약속에await 당신이 받아야합니다 async/await을 사용하고 있습니다.

이렇게하면 orderEmployees에서 생성 된 약속을 반환하지 않는다는 것을 알 수 있습니다. 쉽게 고칠 수 있지만 비동기로 그 기능을 다시 작성하기도 쉽습니다.

orderEmployees: (companyID) => { 
    return User.find({company:companyID}) // Notice the return here 
    .exec() 
    .then((employees) => { 
    // FIRST CONSOLE.LOG 
    console.log(employees); 
    return employees; 
    }) 
    .catch((err) => { 
    return 'error occured'; 
    }); 
}, 

또는

orderEmployees: async(companyID) => { 
    try { 
    const employees = await User.find({company:companyID}).exec(); 
    console.log(employees); 
    return employees; 
    } catch (err) { 
    return 'error occured'; 
    } 
}, 

PS : 오류 처리가 다소 여기에 결함이 있습니다. 대개 함수에서 오류 문자열을 반환하여 오류를 처리하지 않습니다. 이 경우 오류를 전파하고 일부 최상위 UI 코드에서 오류를 처리하는 것이 좋습니다.