자바스크립트 Promise
Promise
Promise 객체는 비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과 값을 나타냅니다.
Promise는 프로미스가 생성된 시점에는 알려지지 않았을 수도 있는 값을 위한 대리자로, 비동기 연산이 종료된 이후에 결과 값과 실패 사유를 처리하기 위한 처리기를 연결할 수 있습니다. 프로미스를 사용하면 비동기 메서드에서 마치 동기 메서드처럼 값을 반환할 수 있습니다. 다만 최종 결과를 반환하는 것이 아니고, 미래의 어떤 시점에 결과를 제공하겠다는 '약속'(프로미스)을 반환합니다.
Promise는 다음 중 하나의 상태를 가집니다.
- 대기(pending): 이행하지도, 거부하지도 않은 초기 상태.
- 이행(fulfilled): 연산이 성공적으로 완료됨.
- 거부(rejected): 연산이 실패함.
대기 중인 프로미스는 값과 함께 이행할 수도, 어떤 이유(오류)로 인해 거부될 수도 있습니다. 이행이나 거부될 때, 프로미스의 then 메서드에 의해 대기열(큐)에 추가된 처리기들이 호출됩니다. 이미 이행했거나 거부된 프로미스에 처리기를 연결해도 호출되므로, 비동기 연산과 처리기 연결 사이에 경합 조건(race condition)은 없습니다.
Promise.prototype.then() 및 Promise.prototype.catch() (en-US) 메서드의 반환 값은 새로운 프로미스이므로 서로 연결할 수 있습니다.
callback으로 명시하게 되면 callback hell이라는 형태가 생겨 가독성문제, 활모양 코드가 생성되면서, 안쪽에서 너무 많은 바깥쪽 scope들에 접근할 수 있게 되면서 실수를 유발할 수 있음
/* resolve : 원하는 결과가 온 경우 handling을 위해 사용 */
/* reject : Error를 생성하여 error handling을 위해 사용 */
new Promise((resolve, reject) => {
...
}).then(value => {
// resolve에 의해 실행되는 분기
}).catch(error => {
// reject에 의해 실행되는 분기 둘 중 하나만 실행 됨
})
# Promise는 비동기 코드를 순차적으로 이어질 수 있도록 처리해줌 (여러 then chain 생성 가능)
node js에서 promise타입을 직접 생성 및 설정하지 않고도 promise형태의 API사용할 수 있도록 지원함
function readFileInPromise(fileName) {
return new Promise((resolve, reject) => {
fs.readFile(filfeName, 'utf-8', (error, value) => {
if (error) {
reject(error)
}
resolve(value)
})
})
}
readFileInPromise('.gitignore').then(value) => console.log(value)
// 같은 형태의 내용 -> node에서 promise형태 API제공
fs.promise.readFile('.gitignore').then(value) => console.log(value)
async function은 다른 async function내부에서 await로 기다려 질 수 있다. 그러므로, 활모양 코드를 만들지 않고 callback hell에서 벗어나 비동기식 코드를 잘 작성할 수 있다.
promise에서는 resolve, reject를 통해 약속된 사항 및 에러처리도 가능한데, async에서는 예외처리를 try,catch로 가능