getAllPost() 함수 관련 질문 드립니다.
581
작성한 질문수 7
// posts.service.ts
async getAllPost() {
return this.postsRepository.find();
}안녕하세요, 궁금한 사항이 있어 질문 남깁니다.
위 코드에서 find() 메서드는 Promise를 리턴하니까 service에 존재하는 getAllPost 함수는 Promise를 리턴하게 되지 않나요?
해당 코드를 실제로 돌려보니 return await this.postsRepository.find() 처럼 돌아가는게 이해가 잘 안됩니다.
강의에서는 "컨트롤러에서 바로 반환을 해주기 때문에 async, await을 안 붙혀도 상관이 없다" 라고 말씀해주셨는데, 음... 바로 반환을 하면 Promise가 return되어야 하지 않나란 생각이 듭니다.
이 부분에 대한 부연 설명이 가능할까요?
감사합니다.
답변 2
1
저도 궁금해서 찾아보고 혹시나 도움이 될까 해서 추가로 남겨봅니다.
자바스크립트와 타입스크립트에서, 비동기 작업을 처리할 때, await은 Promise가 해결될 때까지 기다렸다가 그 다음 코드 줄의 실행을 계속합니다. 하지만, await을 사용할 필요성은 코드 실행의 맥락과 달성하려는 목표에 따라 달라집니다.
프로미스 직접 반환
비동기 함수에서 프로미스를 직접 반환하면서 그 함수 내에서 해결될 필요 없이 반환한다면, await을 사용할 필요가 없습니다. 이는 비동기 함수 자체가 프로미스를 반환하고, 다른 프로미스를 직접 반환함으로써 본질적으로 그들을 연결하는 것입니다. 이는 함수의 호출자가 그 프로미스의 해결이나 거부를 처리하도록 위임하고 싶을 때 유용합니다.
async function fetchData() {
return fetch('https://api.example.com/data'); // 프로미스를 직접 반환
}
// 호출자가 프로미스를 처리함
fetchData().then(data => console.log(data)).catch(error => console.error(error));
해결된 값 사용 필요
함수 내에서 반환하기 전에 프로미스의 해결된 값을 사용해야 한다면, 프로미스가 해결될 때까지 실행을 일시 중지하기 위해 await을 사용해야 합니다.
async function fetchData() {
const response = await fetch('https://api.example.com/data'); // 프로미스가 해결될 때까지 기다림
const data = await response.json(); // 해결된 값을 사용
return data; // 데이터 반환
}
// 호출자가 프로미스를 처리함
fetchData().then(data => console.log(data)).catch(error => console.error(error));
예외 처리
try-catch 블록 내에서 await을 사용할 때, 프로미스 실행 중 발생하는 모든 에러를 잡을 수 있습니다. await 없이 직접 프로미스를 반환한다면, 에러 처리를 호출자에게 위임하게 되며, 호출자는 .catch() 또는 비동기 함수 내의 try-catch 블록을 사용해야 합니다.
요약
- `await` 사용 불필요: 비동기 함수에서 해결된 값을 조작하거나 사용할 필요 없이 직접 프로미스를 반환할 때.
- `await` 사용 필요: 프로미스의 해결된 값을 사용하거나 함수 내에서 에러 처리를 수행해야 할 때.
await을 사용할지 여부는 코드의 구체적인 요구사항과 프로미스 및 그 해결을 어떻게 처리하고 싶은지에 따라 달라집니다.
0
안녕하세요!
말씀하신대로 await를 하든 안하든 둘 다 Promise가 반환되기 때문에 차이가 없습니다.
반환 타입에 Promise 타입을 정의하고 await 반환과 await 하지 않은 반환을 테스트 해보세요. 모두 다 정의에 문제가 없는걸 확인 가능하실겁니다.
예제 1
async function test():Promise<number>{
return await getNumb();
}
async function getNumb(): Promise<number>{
return new Promise<number>((resolve)=>{resolve(1)});
}예제 2
async function test():Promise<number>{
return getNumb();
}
async function getNumb(): Promise<number>{
return new Promise<number>((resolve)=>{resolve(1)});
}
감사합니다!
cascade 질문
0
35
1
@types/bcrypt 설치과정이 누락된것같습니다.
0
41
1
process.env port key 에러
0
43
1
추상화
0
44
1
[공유] DTO optional 필드가 undefined로 잡혀 TypeORM 조건이 깨지는 현상
0
92
2
where 키워드가 들어가는 메서드와 아닌 메서드
0
53
1
BearerTokenGuard에서 db를 조회해서 유저 정보를 불러오는 이유?
0
66
1
app.controller app.service 는 지워도되나요?
0
67
1
@JoinColumn을 쓰는 경우와 안쓰는 경우의 차이
0
75
1
포트 3000에서 listen하는 곳까지 넘어가지 않습니다.
0
62
1
PickType 사용 시 `as const`를 꼭 사용해야 하나요?
0
99
2
socket connect 오류
0
95
2
강의를 들으면서 궁금한 점
0
95
2
DELETE 요청의 반환값은 어떤 기준으로 결정하는 게 좋을까요?
0
55
2
커리큘럼 질문
0
94
2
put 요청은 언제
0
88
3
typeorm VS prisma
0
337
2
142 강의 > 4:00 > 포스트멘 활용 관련 질문 드립니다.
0
74
2
User 데코레이터 버그 수정 전달드립니다.
0
64
1
git 주소 부탁드립니다.
0
109
2
nest g resource 명령어 에러
0
97
2
로그인 엔드포인트 관련 질문
0
81
2
yarn으로 express 다운 후 node 2_server.js 실행 안되는 경우
0
143
3
"흔히 사용되는 메서드" 강의 관련 질문입니다~
0
93
2





