node 동기 비동기 처리 도와주세요 ㅠㅠ
router.get("/test3", function(req, res, next){
const tt = findOneEmail();
console.log("55555555555555")
res.send("+++" + tt);
})
const findOneEmail = () =>
{ let a, b; models.member.findOne
({ where: { mem_email: "email@naver.com" } })
.then(result =>
{
a = result.mem_email+"----6666"
b = "1111" console.log(a + "333");
console.log(b + "4444444444"); return "ㅁ" + a; })
.catch(err =>{ //return err; })
console.log(a + "/////////////1111")
console.log(b + "222222"); }
지금 1, 2, 5, 63, 14 순서로 출력됩니다 ㅠㅠ
return 으로 result값 받아서 router에서 출력할수 있는 방법 없을까요??
일단 javascript의 Promise라는 개념을 공부하시면 좋을 것 같습니다.
저기서 코드가 실행되는 순서가 순차적으로 되지 않는 이유는 models.member.findOne() 이 부분인데요, 저 findOne 부분이 Promise를 return 한다는 사실을 먼저 아셔야됩니다.그리고 직접 만드신 findOneEmail() 함수가 Promise를 return 하도록 만드는게 관건이겠네요.
Arrow Function을 사용하셨으니까 ES6 문법인 async & await로 설명드리고 약간의 코드 수정을 도와드리겠습니다.
const findOneByEmail = (email) => { return models.member.findOne({ where: { mem_email: email } }) } router.get("/test3", async (req, res, next) => { try { const tt = await findOneByEmail("email@naver.com") return res.json(tt) } catch (err) { console.error(err) next(err) } })