자바스크립트에서의 Promise 클래스
이 글에서는 자바스크립트의 Promise 클래스를 설명합니다.
YouTube Video
Promise
Promise
클래스는 비동기 작업을 처리하기 위한 클래스입니다. 작업이 성공하면 결과를 처리하고, 실패하면 에러 처리를 수행합니다. 전통적으로 비동기 작업이 완료되기를 기다릴 때 콜백 함수를 사용했으나, Promise
는 이를 보다 명확하고 강력하게 만듭니다.
1const promise = new Promise((resolve, reject) => {
2 setTimeout(() => resolve("Done!"), 1000);
3});
4
5// Displays "Done!" after 1 second
6promise.then(result => console.log(result));
- 이 코드는 1초 후에 "Done!"을 표시하는 비동기 프로세스의 예시입니다.
- 먼저,
new Promise
를 사용하여 새로운Promise
객체를 생성합니다. 인수는 두 개의 콜백을 받는 함수입니다. 성공 시resolve
, 실패 시reject
가 호출됩니다. setTimeout
을 사용하여 1초 후에resolve()
를 호출합니다.promise
객체의then()
메서드는 완료를 기다리고 결과를 표시합니다.
- 먼저,
기본 구조
Promise
는 결국 성공 또는 실패 중 하나의 결과를 반환하는 객체입니다.
1const promise = new Promise((resolve, reject) => {
2 // Asynchronous operation
3 // Flag indicating whether the operation was successful
4 const success = true;
5
6 if (success) {
7 resolve('Operation successful!');
8 } else {
9 reject('An error occurred');
10 }
11});
- 성공의 경우,
resolve()
가 호출됩니다. - 실패의 경우,
reject()
가 호출됩니다.
Promise
객체는 세 가지 상태를 가집니다.
1promise
2 .then((result) => {
3 console.log(result);
4 })
5 .catch((error) => {
6 console.error(error);
7 })
- 대기 중
- 비동기 프로세스가 아직 완료되지 않았습니다.
- 이행됨
- 비동기 프로세스가 성공하여
resolve()
를 통해 결과가 반환되었습니다. 결과는then()
메서드를 사용해 받을 수 있습니다.
- 비동기 프로세스가 성공하여
- 거부됨
- 비동기 프로세스가 실패하여
reject()
를 통해 오류가 발생했습니다. 오류는catch()
메서드를 사용해 받을 수 있습니다.
- 비동기 프로세스가 실패하여
then()
및 catch()
메서드
Promise
를 사용하여 비동기 작업이 완료되었을 때 수행할 작업을 정의할 수 있습니다. 이를 위해 then()
및 catch()
메서드를 사용합니다.
then()
1const promise = new Promise((resolve, reject) => {
2 resolve('Operation successful!');
3});
4
5promise.then((result) => {
6 console.log(result); // "Operation successful!"
7});
then()
메서드는Promise
가 성공했을 때 호출할 함수를 지정합니다.
catch()
1const promise = new Promise((resolve, reject) => {
2 reject('An error occurred');
3});
4
5promise.catch((error) => {
6 console.error(error); // "An error occurred"
7});
catch()
메서드는Promise
가 실패했을 때 호출할 함수를 지정합니다.
finally()
메서드
1const promise = new Promise((resolve, reject) => {
2 resolve('Operation successful!');
3});
4
5promise
6 .then((result) => {
7 console.log(result);
8 })
9 .catch((error) => {
10 console.error(error);
11 })
12 .finally(() => {
13 console.log('The operation has completed');
14 });
finally()
메서드는Promise
가 성공했든 실패했든 상관없이 최종적으로 실행할 코드를 정의합니다.
then()
체인
then()
은 새로운 Promise
를 반환하므로, 다음 then()
을 체이닝할 수 있습니다.
1const promise = new Promise((resolve, reject) => {
2 setTimeout(() => {
3 resolve(1);
4 }, 1000);
5});
6
7promise
8 .then(result => {
9 console.log(result); // 1
10 return result + 1;
11 })
12 .then(result => {
13 console.log(result); // 2
14 return result + 1;
15 })
16 .then(result => {
17 console.log(result); // 3
18 })
19 .catch(error => {
20 console.error(error.message); // Something went wrong
21 });
- 이 코드에서 초기
resolve()
는 값 1을 넘기고, 각then
이 반환하는 값은 다음then
으로 전달됩니다. catch()
를 사용하면 체인 내에서 발생하는 어떠한 에러도 한 곳에서 처리할 수 있습니다.
실용적인 예
예를 들어, Promise
는 서버에서 데이터를 가져오기 위해 자주 사용됩니다. fetch()
API를 사용하는 예를 살펴봅시다.
1fetch('https://codesparklab.com/json/example.json')
2 .then(response => {
3 if (!response.ok) {
4 throw new Error('Network error');
5 }
6 return response.json();
7 })
8 .then(data => {
9 console.log(data);
10 })
11 .catch(error => {
12 console.error('Error:', error);
13 });
- 이 코드에서
fetch()
는Promise
를 반환하기 때문에, 서버로부터 응답을 받은 후 데이터를 처리하기 위해then()
이 사용됩니다.catch()
를 사용하여 오류를 처리합니다.
여러 Promise 처리하기
Promise.all()
여러 Promise
를 동시에 실행하고 모두 성공했을 때만 진행하려면 Promise.all()
을 사용하세요.
1const promise1 = Promise.resolve(1);
2const promise2 = Promise.resolve(2);
3const promise3 = Promise.resolve(3);
4
5Promise.all([promise1, promise2, promise3])
6 .then((results) => {
7 console.log(results); // [1, 2, 3]
8 })
9 .catch((error) => {
10 console.error('Error :', error);
11 });
- 모든
Promise
가 성공했을 때만then()
이 호출됩니다. 하나라도 실패하면catch()
가 호출됩니다.
Promise.allSettled()
여러 Promise
를 동시에 실행하고, 성공이나 실패에 관계없이 모든 결과를 얻고 싶다면 Promise.allSettled()
를 사용하세요.
1const promise1 = Promise.resolve(1);
2const promise2 = Promise.reject("Failed");
3const promise3 = Promise.resolve(3);
4
5Promise.allSettled([promise1, promise2, promise3])
6 .then((results) => {
7 results.forEach(result => console.log(result));
8 // [
9 // { status: 'fulfilled', value: 1 },
10 // { status: 'rejected', reason: 'Failed' },
11 // { status: 'fulfilled', value: 3 }
12 // ]
13 });
- 모든
Promise
가 해결(이행 또는 거부)되면then()
이 호출됩니다. 각 결과에는status
속성('fulfilled'
또는'rejected'
)이 포함되어 있습니다. 일부가 실패하더라도 다른 작업에는 영향을 주지 않습니다.
Promise.race()
Promise.race()
는 먼저 이행되거나 거부된 Promise
의 결과를 반환합니다.
1const promise1 = new Promise((resolve) => setTimeout(resolve, 100, 'First'));
2const promise2 = new Promise((resolve) => setTimeout(resolve, 500, 'Second'));
3
4Promise.race([promise1, promise2]).then((result) => {
5 console.log(result); // "First"
6});
- 이 예제처럼, 가장 먼저 완료된
Promise
의 결과가 반환됩니다.
async
/await
와의 관계
async
/await
문법을 사용하면 Promise
를 더 직관적으로 작성할 수 있습니다. async
함수는 항상 Promise
를 반환하며, await
는 Promise
가 해결될 때까지 기다립니다.
1async function fetchData() {
2 try {
3 const response = await fetch('https://codesparklab.com/json/example.json');
4 const data = await response.json();
5 console.log(data);
6 } catch (error) {
7 console.error('Error :', error);
8 }
9}
10
11fetchData();
이와 같이 async
/await
를 사용하면 비동기 작업을 동기 코드처럼 작성할 수 있어 가독성이 높아집니다.
요약
Promise
는 비동기 작업의 성공 또는 실패를 처리하기 위한 객체입니다.then()
으로 성공 작업을 처리하고,catch()
로 오류를 처리합니다.finally()
는 성공 여부와 관계없이 마지막에 실행되는 코드를 정의합니다.Promise.all()
또는Promise.race()
를 사용하여 여러Promise
를 함께 처리할 수 있습니다.async
/await
는Promise
를 더 간단하게 작성하기 위한 문법입니다.
위의 기사를 보면서 Visual Studio Code를 사용해 우리 유튜브 채널에서 함께 따라할 수 있습니다. 유튜브 채널도 확인해 주세요.