Promise

Snoop So·2022년 4월 7일
0

javascript

목록 보기
3/5

프로미스는 정확히 말하면 비동기가 아닙니다. 비동기와 프로미스는 각각 무엇일까요?

  • 프로미스를 실행하면 상태값을 즉각적으로 반환하기 때문에, 엄밀히 따지면 비동기가 아니라고 할 수 있다.

동기와 비동기의 차이

  • 동기: 요청과 결과가 동시에 일어남
  • 비동기: 요청과 결과가 동시에 일어나지 않음

프로미스

  • 비동기 연산이 종료된 이후 결과를 알기 위해 사용하는 객체
  • 비동기 매서드를 마치 동기 메서드처럼 값을 반환할 수 있음
  • 콜백 헬 때문에 ES6에서 도입됨
    • 자바스크립트는 코어 엔진과 실행환경(런타임)의 도움을 받아 동시 실행함. 즉, 비동기 작업이 가능
    • WebAPI(dom, ajax, setTimeout...), Task Queue, Event Loop 등과 함께 동작

프라미스 생성

  • new Promise 를 사용
const promise = new Promise((resolve, reject) => {
	if(...){
		resolve("성공!");
	}else{
		reject("실패!");
	}
});

프라미스의 상태값

  • pending: 비동기 처리 수행 전(resolve, reject가 아직 호출되지 않음)
  • fulfilled: 수행 성공(resolve가 호출된 상태)
  • rejected: 수행 실패(reject가 호출된 상태)
  • settled: 성공 or 실패(resolve나 reject가 호출된 상태)

프라미스 후속 매서드

  • 후속 처리 메서드를 통해 비동기 처리 결과(성공 결과나 에러메시지)를 받아서 처리
  1. then
  • then의 첫 인자는 성공 시 실행, 두번째 인자는 실패 시 실행됨 (첫 번째 인자만 넘기는 것도 가능)
// 프라미스를 하나 만들어 봅시다!
let promise = new Promise((resolve, reject) => {
	setTimeout(() => resolve("완료!"), 1000);
});

// resolve
promise.then(result => {
	console.log(result); // 완료!가 콘솔에 찍힐거예요.
}, error => {
	console.log(error); // 실행되지 않습니다.
});
  1. catch(실패시)
// 프라미스를 하나 만들어 봅시다!
let promise = new Promise((resolve, reject) => {
	setTimeout(() => reject(new Error("오류!"), 1000);
});

promise.catch((error) => {console.log(error};);

promise chaining(프라미스 체이닝)

  • 프라미스는 후속 처리 메서드를 체이닝해서 여러 개의 프라미스를 연결할 수 있다.
new Promise((resolve, reject) => {
	setTimeout(() => resolve("promise 1"), 1000);
}).then((result) => { // 후속 처리 메서드 하나를 쓰고,
	console.log(result); // promise 1
	return "promise 2";
}).then((result) => { // 이렇게 연달아 then을 써서 이어주는 거예요.
	console.log(result);
	return "promise 3";
}).then(...);

async

  • 함수 앞에 async를 붙여 사용
  • 프라미스가 아닌 값도 프라미스로 바꿔서 반환해준다.
// async는 function 앞에 써줍니다.
async function myFunc() {
	return "프라미스를 반환해요!"; // 프라미스가 아닌 걸 반환해볼게요!
}

myFunc().then(result => {console.log(result)}); // 콘솔로 확인해봅시다!

await

  • async 없이는 사용할 수 없다.
  • async 함수 안에서만 동작
  • 프라미스가 처리될 때까지 기다렸다가 그 이후에 결과를 반환
async function myFunc(){
	let promise = new Promise((resolve, reject) => {
		setTimeout(() => resolve("완료!"), 1000);
	});

    console.log(promise);

	let result = await promise; // 여기서 기다리자!하고 신호를 줍니다.

    console.log(promise);

	console.log(result); // then(후처리 함수)를 쓰지 않았는데도, 1초 후에 완료!가 콘솔에 찍힐거예요.
}

0개의 댓글