Promise, resolve, setTimeout에 대한 질문입니다.
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에 뭔가 더 특별한 기능이 더 있는 건가요??
답변 1
1
안녕하세요! 돌로스원숭숭님!
관련하여 원인을 깊이있게 이해하실 수 있도록 섹션23 심화편에서 매크로큐와 마이크로큐라는 주제로 다루게 됩니다!^^
따라서, 깊이있는 내용은 해당 강의를 수강해 주시고, 답변으로는 현재 기초수준에서 간단한 답변만 드려보도록 할게요!
약 3단계정도에 걸쳐 필요사항을 안내드릴게요!^^
아래의 코드에서 resolve는 성공했을 때 성공을 알려주기 위해 필요한 녀석, reject는 실패했을때 실패를 알려주기 위해 필요한 녀석이에요!
이 둘 중 하나가 실행되어야지 아래의 코드가 끝이 났다고 컴퓨터는 판단하게 됩니다!
// 안끝남
new Promise((resolve, reject) => {
})
// 끝남
new Promise((resolve, reject) => {
resolve()
})
다음으로, .then은 성공했을 때 실행될 녀석, .catch는 실패했을 때 실행될 녀석이에요!
// 성공하면 실행되는 녀석
new Promise(() => {
}).then(() => {
console.log("나는 성공하면 실행된다")
})
// 실패하면 실행되는 녀석
new Promise(() => {
}).catch(() => {
console.log("나는 실패하면 실행된다")
})
하지만, 이렇게 .then이 실행되게끔 하기 위해서는 성공을 먼저 알려주셔야겠죠?!
따라서, resolve()로 알려주실 필요가 있어요!
new Promise((resolve, reject) => {
resolve() // 1. 나 성공했어
}).then(() => {
console.log("나는 성공하면 실행된다") // 2. 오키 실행할게
})
마지막으로, 함수 안에 함수를 집어넣을 때, 간출인 표현을 사용할 수 있어요!
둘 다 많이 사용되는 패턴으로 꼭 학습해 두세요!
// 간출인 표현
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





