자바스크립트는 Web API연관된 함수들로 인해 순차적으로 실행이 안될 수있어서 콜백함수를 인자로 받아 실행해야 순차적으로 실행할 수 있다.
(개인적으로 async 패턴 최고!!)
Promise 객체는 비동기 연산이 종료된 이후에 연산이 성공적으로 완료되었을때 또는 연산을 실패했을 때의 결과 값을 나타낸다. 최종 결과가 아닌, 미래의 어떤 시점에 결과를 제공하겠다는 '약속'(프로미스)을 반환한다.
promises는 class이기에 new 키워드로 객체를 생성한다. promise는 콜백함수를 인자로 받는데, 콜백함수는 두가지 콜백함수를 resolve, reject 인자로 갖는다.
resolve(성공): 기능을 정상적으로 수행해서 마지막에 최종데이터를 전달하는 콜백함수
reject(실패) : 기능 수행중 문제, 오류가 생기면 new Error를 사용하여 오류를 전달하는 콜백함수
-> new Error(에러오브젝트) : 에러가 일어난 사유를 명시한다.
염두할 점 : 새로운 propmise가 만들어 질때 전달한 콜백함수가 자동적으로 바로 실행된다.(예를 들어 불필요한 네트워크 통신을 할 수도있다.)
const promise = new Promise((resolve, reject) => {
console.log("영서라는 사람의 데이터요청") // promise 생성과 동시 실행
setTimeout(()=>{
resolve('성공, 영서데이터 조회')
reject(new Error('실패, 영서의 데이터가 없어요'));
}, 2000);
});
promise
.then(data => {
console.log(data)
})
.catch(err => {
console.log(err)
})
.finally(() => {
console.log("끝")
});
프로미스 상태를 나타낸다.
promise패턴을 async, await키워드를 이용하여 동기적인 처리연산처럼 작성하는 방법이다.
// 일반적인 자바스크립트 처럼 동기적으로 읽을 수 있는 코드!
// 딜레이 시키는 츠로미스 함수는 일부로 따로 생성해줌
// (코드가 간결해지고 가독성이 높아진다.)
function delay(ms) {
return new Promise(resolve => setTimeout(resolve,ms))
}
async function namePromise1 () {
await delay(1000) // 1초 기다렸다가 프로미스 실행이 성공 했다면 .then 실행
return "지" // "지"를 출력한다.
};
async function namePromise2 () {
await delay(1000)
return "영서"
};
// async 힘수 프로미스 실행값을 각 변수에 담아주고 사용할 수 있다.
async function fullName () {
console.log("영서라는 사람의 데이터요청") // promise 생성과 동시 실행된다.
let firstName = await namePromise1() // 프로미스 실행완료값 전달 "지"
let lastName2 = await namePromise2() // 프로미스 실행완료값 전달 "영서"
return [`${firstName}${lastName2}`] // ["지영서"]
};
fullName ().then(console.log)
참조
드림코딩엘리 유튜브
mdm