Promise.all
을 사용하게 되면, 전체 함수를 실행하고 나온 결괏값 Promise만 할당해주면 해결될 문제이지만 구현해보는것이 목적
type Fn<T> = () => Promise<T>
function promiseAll<T>(functions: Fn<T>[]): Promise<T[]> {
// 결과를 저장할 배열을 초기화합니다.
const results: T[] = [];
// 완료된 프로미스 수를 추적합니다.
let completedPromises = 0;
// 새로운 프로미스를 반환합니다.
return new Promise<T[]>((resolve, reject) => {
// 입력 배열의 길이가 0인 경우, 빈 배열로 즉시 resolve 합니다.
if (functions.length === 0) {
resolve([]);
return;
}
// 각 함수에 대해 반복합니다.
functions.forEach((func, index) => {
// 함수를 실행하고 반환된 프로미스를 처리합니다.
func()
.then((value) => {
// 결과를 해당 인덱스에 저장합니다.
results[index] = value;
completedPromises++;
// 모든 프로미스가 완료되었는지 확인합니다.
if (completedPromises === functions.length) {
resolve(results);
}
})
.catch((error) => {
// 에러가 발생하면 즉시 reject 합니다.
reject(error);
});
});
});
}