21.10.15 Promise

2021. 10. 15. 19:46작업/JavaScript

Promise :

  • Callback chain을 쓰지 않고도 비동기 코드를 깔끔하게 쓸 수 있게 해줌.
  • 비동기 실행이 완료된 후에 .then .catch .finally 등의 핸들러를 붙여 데이터처리로직, 에러처리로직, 클린업로직을 실행한다.
  • promise 객체는 fulfilled, pending, rejected 세 가지 상태가 있다.
    • fulfilled : 비동기 실행이 성공한 상태
    • pending : 비동기 실행이 끝나기를 기다리는 상태
    • rejected : 비동기 실행이 실패한 상태

Multiple Promise handling :

Promise.all() 모든 프로미스가 fulfilled되기를 기다린다. 하나라도 에러 발생하면 모든 프로미스 요청이 중단.

Promise.allSettled() 모든 프로미스가 settled 되길 기다린다.

Promise.race() 넘겨진 프로미스들 중 하나라도 settled 되기를 기다린다.

Promise.any() 넘겨진 프로미스 중 하나라도 fulfilled 되기를 기다린다.

 

Promise에서 중요하게 공부해야 할 두 가지

1. State : pending -> fulfilled or rejected

2. Producer(정보제공)와 Consumer(정보소비) 이해

새로운 Promise가 만들어질 때, 우리가 전달한 executor = (resolve,reject)가 인자 라는 Callback 함수가 자동적으로 실행된다.

resolve와 then

Promise를 이용해 비동기 작업을 잘 실행완료 했다! -> resolve가 데이터값을 전달한다(Good Job!)

이제 Consumer입장에서 then, catch, finally를 해본다.

my_promise.then() 은 내가 my_promise가 비동기 작업을 성공적으로 수행했다! 그러면 다음 값을 전달해라~라는 함수.

이 때 저 인자로 넣어준 value에는 아까 resolve 시 넣은 데이터값이 들어감.

만약 resolve대신 .reject()를 하면 비동기 작업을 실패했을 때 ~를 해라라는 함수.

(이 때 사용하는 Error 역시 자바스크립트에서 제공하는 object!)

reject와 then
reject로 No Network라는 에러를 띄워야 하는데.

reject를 사용했기 때문에 우리가 만든 Error인 노 네트워크TT라는 문구가 떠야 하는데

현재 promise.then()으로 성공적인 경우만 써줬기 때문에 Uncaught라고 뜬다.

reject와 catch사용
reject와 catch로 아까 만들어준 에러를 띄움

Chaning : promise.then()은 promise 자체를 return하게 되고, 그 return된 promise에 다시 한번 promise.catch()를 수행할 수 있다.

promise.finally()는 비동기 작업을 성공하든 실패하든 마지막에 해당 함수를 호출한다.

(reject을 써도 되고 resolve를 써도 된다!)

finally와 reject

Promise Chaining : my_promise.then 하고 그 안에 또 다른 Promise를 해도 된다!

Error Handling :

Promise로 비동기 작업 3개를 만들고, resolve시키고 then으로 다음 거 실행.
resolve 완료!
중간에 reject 그리고 catch

만약 중간에 달걀 가져오는 부분에서 reject로 에러가 나도, 마지막에 catch를 해주면 작업들이 연결되어 catch에서 에러를 띄울 수 있다.

이렇게 중간에 reject가 되어 한 Promise작업에 실패해도.. catch를 then들 사이에 껴주어서 임기응변으로

Promise Chain을 완수 할 수 있다!

 

Callback Hell을 Cleaning 하자!

아까의 더러운 Callback 함수의 onSuccess나 onError같은 Callback 함수를 받을 필요 x
CallbackHell to Promise

 

Before Promise
After Promise

userWithRole도 필요 없고, 받은 값들로 계속 연결연결해서 user.name으로 해줘버려도 된다! 

그리고 만약 error가 발생해도 catch로 에러를 띄워주면 된다. 

 

Success to Get Role
Fail to Get Role