A. 프로미스는 자바스크립트 비동기 처리에 사용되는 객체. 프로미스는 주로 서버에서 받아온 데이터를 화면에 표시할 때 사용
new Promise
에 전달되는 함수는 executor(실행자, 실행 함수)라고 부른다. executor는 new Promise
가 만들어질 때 자동으로 실행되는데 결과를 최종적으로 만들어내는 제작 코드를 포함한다. executor의 인수 resolve와 reject는 자바스크립트에서 자체 제공하는 콜백으로 개발자는 resolve와 reject를 신경쓰지 않고 executor 안 코드만 작성하면 된다. 단, executor에선 결과를 얻는 즉시 상황에 따라 인수로 넘겨준 콜백 중 하나를 반드시 호출해야 한다.let promise = new Promise(function resolve, reject) {
// executor(제작 코드, '가수')
});
state - “pending(대기)” → resolve가 호출되면 “fulfilled”, reject가 호출되면 “rejected”로 변한다.
💡 이행(resolved) 혹은 거부(rejected) 상태의 프로미스는 처리된(settled) 프로미스라고 부른다.result - undefined → resolve(value)가 호출되면 value로, reject(error)가 호출되면 error로 변한다.
A. 상태란 프로미스의 처리 과정을 의미하며
new Promise()
로 프로미스를 생성하고 종료될 때까지 3가지 상태를 갖는다.
new Promise()
메서드를 호출하면 대기(Pending)상태가 된다. new Promise()
메서드를 호출할 때 콜백 함수를 선언할 수 있고, 콜백 함수의 인자는 resolve, reject이다.new Promise(function resolve, reject) {
// ...
}
function getData() {
return new Promise(function(resolve, reject) {
var data = 100;
resolve(data);
}
}
// resolve()의 결과 값 data를 resolvedData로 받음
getData().then(function(resolvedData) {
console.log(resolvedData);
});
function getData() {
reject(new Error("Request is failed"));
}
getData().then().catch(function(err) {
console.log(err);
});
프로미스 처리 흐름
프로미스에서 가장 중요하고 기본이 되는 메소드
promise.then(
function(result) {}, // 첫번째 인수 : 프로미스가 이행되었을 때 실행되는 함수
function(error) {} // 두번째 인수 : 프로미스가 거부되었을 때 실행되는 함수
);
// 작업이 성공적으로 처리된 경우만 다루고 싶다면 .then에 인수를 하나만 전달
에러가 발생한 경우만 다루고 싶을 때 사용
let promise = new Promise((resolve, reject) => {
setTimeout(()=>reject(new Error("에러 발생")), 1000);
});
// .catch(f)는 promise.then(null,f)와 동일하게 작동
promose.catch(alert); // promise.then(null, alert); 동일
.finally(f)
호출은 .then(f,f)
와 유사)finally 핸들러에는 인수가 없으며, finally에서는 프로미스가 이행되었는지 거부되었는지 알 수 없다.
finally 핸들러는 자동으로 다음 핸들러에 결과와 에러를 전달한다.
new Promise((resolve), reject) => {
setTimeout(() => resolve("결과"), 2000);
})
.finally(() => alert("프로미스가 준비되었습니다.")
.then(result => alert(result));
A. 순차적으로 처리해야하는 비동기 작업을 여러개 사용하는 경우 활용
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000); // (*)
}).then(function(result) { // (**)
alert(result); // 1
return result * 2;
}).then(function(result) { // (***)
alert(result); // 2
return result * 2;
}).then(function(result) {
alert(result); // 4
return result * 2;
});
출처 :