이전 질문에 이어서 질문드립니다.
이전에 findEmail 과 같은 함수에서 promise allSettled를 사용해야 할지 질문했었는데 findEmail에 allSettled를 적용시키려고 시도해봤습니다. 이전 질문의 코드를 아래 처럼 재구성하였습니다.
await Promise.allSettled([
this.authRepositry.isExistUserWithRealName(realName),
this.authRepositry.isExistUserWithPhoneNumber(phoneNumber),
]).then((data) => {
const errors = data.map((idx) =>
idx.status === "rejected" ? idx.reason : false,
);
if (errors.includes(false)) {
const foundWithRealName = data[0].value;
}
throw new BadRequestException(errors, "Find Email Error");
});
allSettled 인자의 함수들에는 실명과 전화번호가 없을 시 에러를 내는 코드가 있고 에러가 있을시 rejected 상태의 인덱스를 errors 배열에 담고 아닐 시 false를 담습니다. 그리고 errors에 false값이 포함되어있다면 실명과 전화번호를 매치시켜 일치한다면 email을 리턴하게끔 하려 했습니다. 그런데 data변수가 PromiseRejectedResult라서 value속성이 없다 합니다. data[idx].value를 해야 value 안에 있는 id를 서로 비교 시킬수가 있는데 value를 사용할 수가 없습니다. 만약 콘솔로 찍어보면 "fullfiled" 라고 뜨기는 하는데 말이죠. 제가 디버그 콘솔을 자주 사용하는데 const foundWithRealName이 있는 라인에서 data[0].value를 찍어보면 정상적으로 User Entity값을 얻어올 수가 있습니다. 어떻게 좋은 방법이 없을까요?
답변 1
0
일단 await을 하시는데 왜 then을 붙이시나요? 여기서부터 문법 문제가 있고요.
const [nameResult, phoneNumberResult] = await Promise.allSettled
에러가 나는 상황에서 무엇을 하려고 하시는건지 잘 모르겠습니다. allSettled 이후에서는 기존 allSettled 쓰기 전에 로직 그대로 쓰시면 됩니다. 데이터만 nameResult, phoneNumberResult에서 잘 꺼내서요.
0
흠.. 확실히 await이랑 then을 같이 쓰는건 제가 실수했었네요. 그런데도 제가 말했었던 status가 fullfield 일 때 value프로퍼티를 사용못하는건 변함이 없네요. 제가 작성한 코드 보여드릴게요.
const { realName, phoneNumber } = findEmailDto;
const promises = await Promise.allSettled([
this.authRepositry.isExistUserWithRealName(realName),
this.authRepositry.isExistUserWithPhoneNumber(phoneNumber),
]);
const errors = promises.filter((idx) => idx.status === "rejected");
if (errors.length)
throw new BadRequestException(errors, "Find Email Error");
const [realNameResult, phoneNumberResult] = promises;
console.log(realNameResult.value);
console.log(phoneNumberResult.value);
value에 빨간줄이 그어져 있는데 에러 메세지는 각각 같습니다.
Property 'value' does not exist on type 'PromiseSettledResult<UserEntity>'.
Property 'value' does not exist on type 'PromiseRejectedResult'.
만약 value 대신 status가 "rejected"일 때 사용 할 수 있는 reasone을 사용하면 위와 유사한 에러가 납니다.
Property 'reason' does not exist on type 'PromiseSettledResult<UserEntity>'.
Property 'reason' does not exist on type 'PromiseFulfilledResult<UserEntity>'.
혹시나 해서 await 대신 then도 한번 사용해봤지만 결과는 같습니다.
const { realName, phoneNumber } = findEmailDto;
const promises = Promise.allSettled([
this.authRepositry.isExistUserWithRealName(realName),
this.authRepositry.isExistUserWithPhoneNumber(phoneNumber),
]);
promises.then((data) => {
const errors = data.filter((idx) => idx.status === "rejected");
if (errors.length)
throw new BadRequestException(errors, "Find Email Error");
const [realNameResult, phoneNumberResult] = data;
console.log(realNameResult.value);
console.log(phoneNumberResult.value);
});
0
0
직접 코드까지 알려주시니 감사합니다! 근데 여기서 궁금한게 있는데 isRejected와 isFullfield 함수의 리턴값 타입 부분에서 is 뒤에 PromiseRejectedResult,PromiseFulfilledResult<T> 명시해 주셨는데 input 매개변수는 PromiseRejectedResult,PromiseFulfilledResult<T> 이다. 이런식으로 명시해주기 위해 사용하나요? as 는봤어도 is는 처음보네요.
강의자료는 어디서 다운받나요?
0
146
4
질문 있습니다.
0
320
3
코드 편집기 확장 프로그램
0
220
2
(질문)비밀 저장소에 접근하기 위한 인증 정보는 로컬 .env에 저장하는지?
0
165
2
(질문)외부 저장소를 통한 환경변수 불러오기 비동기 질문
0
179
3
로그인을 해도 LoggedInGuard쪽에서 false값이 나옵니다.
0
163
2
로그인방법이 고민됩니다.
0
197
2
yarn seed 명령어 실행 시 데이터 삽입 안됨
0
305
4
yarn run db:create 시에 발생하는 데코레이터 오류
0
249
2
npm run db:create 시에 발생하는 decorating 오류
0
245
2
RxJS 디버깅 질문 있습니다.
0
201
3
CacheManager에 대해 질문 있습니다.
0
185
2
로깅은 어떻게 하는게 효율적일까요?
0
240
1
CORS 질문 있습니다.
0
428
2
쿠키 옵션에 대해서 질문 있습니다.
0
190
2
로그아웃 요청이 403 forbidden 에러가 나는데 왜그런걸까요??
0
458
1
401 unauthorized문제
0
306
1
가드의 장점에 대해서 질문이 있습니다.
0
234
1
로그 관리에 대해 질문 있습니다.
0
256
2
CORS 에러 질문 있습니다.
0
329
2
배포 환경 DB 연결 질문 있습니다.
0
418
2
socket io 미 연결 문제 (nest & flutter)
1
1169
3
no elements in sequence 에러 관해서 질문이 있습니다.
0
466
1
start:dev-backup으로 돌리면 핫 리로딩이 되요 정상인가요?
0
327
1





