
JavaScript Promise에는 여러 개의 Promise를 다루는 데 유용한 몇 가지 정적 메서드가 있음.
대표적으로
const promise1 = Promise.resolve(1);
const promise2 = new Promise((resolve) => setTimeout(resolve, 200, 2));
const promise3 = new Promise((resolve) => setTimeout(resolve, 100, 3));
Promise.all([promise1, promise2, promise3])
.then((values) => {
console.log(values); // [1, 2, 3]
})
.catch((error) => {
console.error(error); // 처리되지 않음
});
const promise4 = Promise.resolve(1);
const promise5 = Promise.reject('Error');
const promise6 = Promise.resolve(3);
Promise.all([promise4, promise5, promise6])
.then((values) => {
console.log(values); // 처리되지 않음
})
.catch((error) => {
console.error(error); // Error
});
활용: 여러 비동기 작업의 결과가 모두 필요한 경우에 유용.
예를 들어, 여러 API 호출을 병렬로 실행하고 모든 응답을 처리해야 할 때 사용할 수 있음
const promise1 = Promise.resolve(1);
const promise2 = Promise.reject('Error');
const promise3 = new Promise((resolve) => setTimeout(resolve, 100, 3));
Promise.allSettled([promise1, promise2, promise3])
.then((results) => {
console.log(results);
// [
// { status: 'fulfilled', value: 1 },
// { status: 'rejected', reason: 'Error' },
// { status: 'fulfilled', value: 3 }
// ]
});
활용: 모든 비동기 작업의 결과를 알아야 할 때 유용.
예를 들어, 여러 API 호출의 성공 여부와 관계없이 모든 응답을 처리해야 할 때 사용할 수 있음
const promise1 = Promise.reject('Error1');
const promise2 = new Promise((resolve) => setTimeout(resolve, 200, 2));
const promise3 = Promise.reject('Error3');
Promise.any([promise1, promise2, promise3])
.then((value) => {
console.log(value); // 2
})
.catch((error) => {
console.error(error); // 처리되지 않음
});
const promise4 = Promise.reject('Error1');
const promise5 = Promise.reject('Error2');
Promise.any([promise4, promise5])
.then((value) => {
console.log(value); // 처리되지 않음
})
.catch((error) => {
console.error(error); // AggregateError: All promises were rejected
});
활용: 여러 Promise 중 가장 빠른 응답이 필요한 경우에 유용.
예를 들어, 여러 서버에 동일한 요청을 보내고 가장 먼저 응답하는 서버의 결과를 사용하고 싶을 때 사용할 수 있음
const promise1 = new Promise((resolve) => setTimeout(resolve, 500, 1));
const promise2 = Promise.reject('Error');
const promise3 = new Promise((resolve) => setTimeout(resolve, 100, 3));
Promise.race([promise1, promise2, promise3])
.then((value) => {
console.log(value); // 3
})
.catch((error) => {
console.error(error); // 처리되지 않음
});
const promise4 = new Promise((resolve) => setTimeout(resolve, 500, 1));
const promise5 = Promise.reject('Error');
Promise.race([promise4, promise5])
.then((value) => {
console.log(value); // 처리되지 않음
})
.catch((error) => {
console.error(error); // Error
});
활용:
Promise 중 가장 빠른 결과가 필요한 경우에 유용.
예를 들어, 타임아웃을 구현하거나, 여러 작업 중 가장 먼저 완료되는 작업을 처리해야 할 때 사용할 수 있음.
import { useQuery } from '@tanstack/react-query';
const query1 = useQuery({ queryKey: ['data1'], queryFn: () => fetchData1() });
const query2 = useQuery({ queryKey: ['data2'], queryFn: () => fetchData2() });
const query3 = useQuery({ queryKey: ['data3'], queryFn: () => fetchData3() });
// Promise.all을 사용하여 모든 쿼리가 완료될 때까지 기다립니다.
Promise.all([query1.fetch(), query2.fetch(), query3.fetch()])
.then(([data1, data2, data3]) => {
// 모든 데이터가 준비되었습니다. 이제 UI를 업데이트하거나 다른 작업을 수행할 수 있습니다.
console.log(data1, data2, data3);
})
.catch((error) => {
// 쿼리 중 하나라도 실패한 경우 처리합니다.
console.error(error);
});
import { useQuery } from '@tanstack/react-query';
const query1 = useQuery({ queryKey: ['data1'], queryFn: () => fetchData1() });
const query2 = useQuery({ queryKey: ['data2'], queryFn: () => fetchData2() });
const query3 = useQuery({ queryKey: ['data3'], queryFn: () => fetchData3() });
Promise.allSettled([query1.fetch(), query2.fetch(), query3.fetch()])
.then((results) => {
results.forEach((result) => {
if (result.status === 'fulfilled') {
console.log(result.value); // 성공한 쿼리 결과 처리
} else {
console.error(result.reason); // 실패한 쿼리 오류 처리
}
});
});
import { useQuery } from '@tanstack/react-query';
const query1 = useQuery({ queryKey: ['data1'], queryFn: () => fetchDataFromSource1() });
const query2 = useQuery({ queryKey: ['data2'], queryFn: () => fetchDataFromSource2() });
Promise.any([query1.fetch(), query2.fetch()])
.then((data) => {
// 첫 번째로 성공한 쿼리 결과를 사용합니다.
console.log(data);
})
.catch((error) => {
// 모든 쿼리가 실패한 경우 처리합니다.
console.error(error);
});
import { useQuery } from '@tanstack/react-query';
const query = useQuery({
queryKey: ['data'],
queryFn: () => {
const fetchPromise = fetchData();
const timeoutPromise = new Promise((_, reject) =>
setTimeout(() => reject(new Error('Timeout')), 5000) // 5초 타임아웃
);
return Promise.race([fetchPromise, timeoutPromise]);
},
});
if (query.isLoading) {
return <div>Loading...</div>;
}
if (query.isError) {
return <div>Error: {query.error.message}</div>;
}
return <div>Data: {query.data}</div>;