개발일지
[javascript] Promise(1) - then(), catch(), finally(), resolve(), reject() 본문
[javascript] Promise(1) - then(), catch(), finally(), resolve(), reject()
강강강 2021. 12. 29. 14:54- 자바스크립트는 기본적으로 동기로 실행한다. (실행이 끝나야 다음 코드 실행)
- Promise 는 비동기로 처리한다.
- 코드를 연속으로 처리하지 않고 중간에 흐름이 끊어졌다가 연결된 코드를 처리할 수 있는 환경이 되었을 때 실행하겠다고 약속하는 느낌 (시멘틱)
[ Promise 처리 흐름 ]
const obj = new Promise((resolve, reject) => { // pending 상태
resolve();
log("Promise");
});
obj.then((value) => { // settled 상태
log("success");
}, (reason) => {
log("fail");
});
log("last");
위 코드 결과
Promise last success |
[ Promise 상태 ]
1. Pending
- new Promise() 로 인스턴트 생성
2.Settled (fulfilled, rejected)
- Pending 이 종료된 상태를 나타내고 fullfilled, rejected 상태로 구분된다.
- 바인딩한 함수가 호출된다.
- fullfilled: then() 의 첫번째 함수 호출
- rejected: then() 의 두번째 함수 호출
then()
- 성공과 실패 핸들러 함수를 작성한다.
- 값은 반환하지 않고 Promise 인스턴스를 반환한다.
- 첫번째 파라미터: 성공일때 실행될 핸들러 함수
- 두번째 파라미터: 실패일때 실행될 핸들러 함수
then() 의 return 값
- then() 에서 Promise 인스턴스를 반환한다.
- return 값을 반환하지 않는다.
- Method chain 에서 this 를 return 하는 것과 같은 개념으로 then().then() 형태로 then() 을 연속해서 호출할 수 있다.
- return 값을 [[PromiseValue]] 에 설정하고 [[PromiseValue]] 값을 다음 then() 의 파라미터 값으로 넘겨준다.
const obj = new Promise((resolve, reject) => {
resolve(100);
});
obj.then((value) => { // value = 100
return value + 50; // 150 을 반환하지 않고 인스턴스를 반환한다. ([[PromiseValue]]에 설정)
// 만약 return 을 작성하지 않으면 undefined 를 [[PromiseValue]] 에 설정
}).then((param) => { // param 에 [[PromiseValue]] 값인 150 이 설정
log(param); // 150 출력
});
실행결과
150 |
catch()
- reject 의 핸들러 함수를 작성한다.
- then() 의 두번째 파라미터를 작성하지 않고 대신에 catch(param) 을 작성한다.
- return 문의 표현식 평가 결과를 [[PromiseValue]] 에 설정한다.
catch() 의 return 값
- Promise 인스턴스를 반환하기 때문에 catch().then() 처럼 이어서 then() 을 호출할 수 있다.
- [[PromiseValue]] 값을 then() 의 파라미터 값으로 넘겨준다.
const check = false;
const obj = new Promise((reslove, reject) => {
resolve(100); // then() 의 첫번째 파라미터 호출됨
});
obj.then((value) => {
throw "error"; //error발생 [[PromiseValue]] 에서 "error" 설정됨
}).catch((catch1) => { // 위 에러 여기서 받음
log("catch1:" + catch1);
return "정상"; // 에러가 발생해 catch이 실행됐지만 catch 에서 에러가 발생하지 않으면 바로 아래의 then()이 실행된다.
}).then((param) => {
log("then:" + param); // 여기서 에러가 발생하지 않아 밑에 catch문은 실행되지 않고 promise 처리가 끝이 난다.
}).catch((catch2) => {
log("catch2:" + catch2);
});
});
실행결과
catch1:error then:정상 |
finally() *ES2018 부터 지원
- 성공 실패 관계없이 파라미터의 핸들러 함수가 실행된다.
- 핸들러 함수에 파라미터가 없다.
- then(), catch() 의 같은 코드를 finally() 에 작성하면 코드 중복을 피할 수 있다.
const obj = new Promise((resolve, reject) => {
resolve(100); // then 함수 호출
});
obj.then((value) => {
log(value);
return 200; // [[PromiseValue]] 에 200 설정
}).catch((reason) => {
log(reason);
}).finally((param) => { // 문법적으로 param 파라미터 사용하지 않음 [[PromiseValue]]
log("finally:" + param);
});
실행결과
100 finally:undefined |
resolve()
- 성공상태의 Promise 인스턴스를 생성하여 반환한다.
- Promise.resolve() 형태로 작성한다.
- 파라미터 값에 따라 생성방법이 다르다.
* 파라미터에 값을 작성하면 파라미터값으로 Promise 인스턴스를 생성하여 반환
* 파라미터에 Promise 인스턴스를 작성하면 파라미터의 Promise 인스턴스의 값을 사용하여 Promise 인스턴스를 생성하여 반환
const obj = Promise.resolve("test"); // new 를 사용하지 않지만 promise 인스턴스를 생성해서 반환한다.
obj.then((value) => {
log(value);
});
log("end");
실행결과
end test |
thenable
- Promise.resolve() 의 파라미터에 then() 을 작성한 형태
const obj = Promise.resolve({
then(resolve, reject){
resolve([1,2]);
}
});
obj.then((value) => {
log(value);
});
log("끝");
reject()
- 실패 상태의 Promise 인스턴스를 생성하여 반환한다.
- Promise.reject() 형태로 작성한다.
- 파라미터에 reject 사유를 작성한다.
const obj = Promise.reject("fail"); // 실패상태이므로 then의 두번째 파라미터함수가 호출된다.
obj.then(
(value) => log(value),
(value) => log(value) // fail
);
'javascript' 카테고리의 다른 글
[javascript] async/await (1) (0) | 2021.12.29 |
---|---|
[javascript] Promise(2) - all(), race() (0) | 2021.12.29 |
변수 구분 , use strict (0) | 2021.07.27 |
Object, Instance, Property, function (0) | 2021.07.27 |
[Javascript]promise (0) | 2021.07.06 |