inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

03-08 동기 방식 / 비동기 방식

Promise, resolve, setTimeout에 대한 질문입니다.

해결된 질문

335

돌로스원숭숭

작성한 질문수 2

0

 

async function aaa() {   console.log(1);   console.log(2);   await new Promise((resolve, reject) => {     setTimeout(resolve, 3000);        }).then(() => {     console.log("히히히");   });   console.log(3); }  aaa();
async function aaa() {
  console.log(1);
  console.log(2);
  await new Promise((resolve, reject) => {
    setTimeout(() => {}, 3000);
  }).then(() => {
    console.log("히히히");
  });
  console.log(3);
}

aaa();

맨위의 코드는

1

2

히히히

3

이렇게 잘 찍힙니다.

위의 코드에서 setTimeout(resolve,3000) 에서 resolve를 ()=>{} 로 바꾸니,

1

2

이렇게 찍힙니다.

resolve라는 것을 쓰지 않음으로써 then으로 가지 못해 console.log('히히히')가 동작을 하지 않는 것은 이해가 되는데, promise 외부 코드인 console.log(3); 이 동작하지 않는건 이해가 되지 않습니다.

resolve에 뭔가 더 특별한 기능이 더 있는 건가요??

javascript node.js

답변 1

1

노원두

안녕하세요! 돌로스원숭숭님!

관련하여 원인을 깊이있게 이해하실 수 있도록 섹션23 심화편에서 매크로큐와 마이크로큐라는 주제로 다루게 됩니다!^^

따라서, 깊이있는 내용은 해당 강의를 수강해 주시고, 답변으로는 현재 기초수준에서 간단한 답변만 드려보도록 할게요!

 

3단계정도에 걸쳐 필요사항을 안내드릴게요!^^

  1. 아래의 코드에서 resolve는 성공했을 때 성공을 알려주기 위해 필요한 녀석, reject는 실패했을때 실패를 알려주기 위해 필요한 녀석이에요!
    둘 중 하나가 실행되어야지 아래의 코드가 끝이 났다고 컴퓨터는 판단하게 됩니다!

 // 안끝남
new Promise((resolve, reject) => {

})

 // 끝남
new Promise((resolve, reject) => {
    resolve()
})

 

  1. 다음으로, .then은 성공했을 때 실행될 녀석, .catch는 실패했을 때 실행될 녀석이에요!

// 성공하면 실행되는 녀석
new Promise(() => {

}).then(() => {
    console.log("나는 성공하면 실행된다")
})

// 실패하면 실행되는 녀석
new Promise(() => {

}).catch(() => {
    console.log("나는 실패하면 실행된다")
})

 

하지만, 이렇게 .then이 실행되게끔 하기 위해서는 성공을 먼저 알려주셔야겠죠?!
따라서, resolve()로 알려주실 필요가 있어요!

new Promise((resolve, reject) => {
    resolve() // 1. 나 성공했어
}).then(() => {
    console.log("나는 성공하면 실행된다") // 2. 오키 실행할게
})

 

  1. 마지막으로, 함수 안에 함수를 집어넣을 때, 간출인 표현을 사용할 수 있어요!
    둘 다 많이 사용되는 패턴으로 꼭 학습해 두세요!

 // 간출인 표현
setTimeout(resolve, 3000);

// 제대로 풀어쓴 표현
setTimeout(() => { 
   resolve() 
}, 3000)

 

 

최종적으로 정리하면 아래와 같습니다!^^

// 첫번째 방식
async function aaa() {   
    console.log(1); // 1. '1'이 출력됩니다.
    console.log(2); // 2. '2'이 출력됩니다.

    // await 가 붙어 있으므로, 이것(new Promise 전체가 한 줄임)이 끝나야만,
    // 다음 줄인 console.log(3)이 실행됩니다.
    await new Promise((resolve, reject) => { 

        setTimeout(() => { 
           resolve() // 3. '나 성공했어!' 알려줍니다.
        }, 3000)
 
    }).then(() => {
        console.log("히히히"); // 4. 그럼 실행한다! => '히히히'가 출력됩니다.
    });   


    console.log(3);  // 5. 다 끝났으므로 '3'이 출력됩니다.
}  

aaa();



// 두번째 방식
async function aaa() {
  console.log(1); // 1. '1'이 출력됩니다.
  console.log(2); // 2. '2'이 출력됩니다.

  // await 가 붙어 있으므로, 이것(new Promise() 전체가 한 줄임)이 끝나야만,
  // 다음 줄인 console.log(3)이 실행됩니다.
  await new Promise((resolve, reject) => {

    setTimeout(() => {}, 3000); // 3. 성공과 실패를 기다립니다.

  }).then(() => {
    console.log("히히히"); // 4. 성공 알림을 받아야 실행되는데 계속 기다립니다.
  });


  console.log(3); // 5. await가 붙은 윗줄이 끝나야 내가 실행되는데 기다립니다.
}

aaa();

 

그래프 ql 문서 사용할때 느낌표 남는거 어떻게 없애나요?

0

84

2

강의 전체 소스 코드를 받고싶습니다.

0

76

2

fontawesome 사용 문의

0

79

2

소스 코드 부탁드립니다~

0

85

2

깃 레포지터리 소스

0

85

2

커리큘럼12.css 정렬 에 나오는 과제 정답알고싶어요

0

73

2

10-01 Entity TypeOrmModule.forRoot 에 entities

0

88

3

강의 버전관련 문의입니다

0

103

2

Ubuntu 설치 관련

0

61

1

schema.gql 질문 드립니다.

0

51

1

서버 재실행시 Many to Many

0

102

3

input 관련 문의

0

90

2

Rest API 보다는 graphql이 주된 내용인데

0

131

2

강의 전체 소스코드 받을수있을까요?

0

155

1

도커볼륨 마운트 관련

0

127

2

findOne 타입스크립트오류

0

109

1

http => htrtps 호출 인증서 신뢰 오류

0

353

1

self-signed certificate in certificate chain 에러 발생

0

417

1

mongoose 설치 오류

0

142

1

특정 API, 특정 IP 허용 (단일경로에 CORS 활성화)

0

283

2

08-06

0

180

3

구조랑 패턴 관련해서 질문

0

125

2

mydocker

0

128

2

coolsms statuscode 2000 인데 전송안돼는 경우 확인.

0

156

1