작성
·
458
0
// posts.service.ts
async getAllPost() {
return this.postsRepository.find();
}
안녕하세요, 궁금한 사항이 있어 질문 남깁니다.
위 코드에서 find() 메서드는 Promise를 리턴하니까 service에 존재하는 getAllPost 함수는 Promise를 리턴하게 되지 않나요?
해당 코드를 실제로 돌려보니 return await this.postsRepository.find()
처럼 돌아가는게 이해가 잘 안됩니다.
강의에서는 "컨트롤러에서 바로 반환을 해주기 때문에 async, await을 안 붙혀도 상관이 없다" 라고 말씀해주셨는데, 음... 바로 반환을 하면 Promise가 return되어야 하지 않나란 생각이 듭니다.
이 부분에 대한 부연 설명이 가능할까요?
감사합니다.
답변 2
0
저도 궁금해서 찾아보고 혹시나 도움이 될까 해서 추가로 남겨봅니다.
자바스크립트와 타입스크립트에서, 비동기 작업을 처리할 때, 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)});
}
감사합니다!