동기화(synchronization) 개념으로 비동기 코드를 다루는 방법 : callbacks, promise, async/await
promise와 같은 비동기 작업은 event queue에 들어갑니다. 그리고 main thread가 끝난 후 실행되어 후속 JavaScript 코드가 차단되는 것을 방지합니다. queued 작업은 가능한 빨리 완료되어 JavaScript 환경으로 결과를 반환해줍니다.
Promise is a JavaScript object for asynchronous operator
함수에 콜백을 전달하는 대신에, 콜백을 첨부하는 방식의 객체
비동기 메서드에서 마치 동기 메서드처럼 값을 반환할 수 있습니다. 다만 최종 결과를 반환하지는 않고, 프로미스를 반환해서 미래의 어떤 시점에 결과를 제공합니다. 미래에 어떤 종류의 결과가 반환됨을 약속해주는 오브젝트
executor : resolve 및 reject 인수를 전달할 실행 함수.
const myFirstPromise = new Promise((resolve, reject) => {
// do something asynchronous which eventually calls either:
//
// resolve(someValue) // fulfilled
// or
// reject("failure reason") // rejected
});
- callbacks
chooseToppings(function(toppings) { placeOrder(toppings, function(order) { collectOrder(order, function(pizza) { eatPizza(pizza); }, failureCallback); }, failureCallback); }, failureCallback);
- promise
chooseToppings() .then(placeOrder) .then(collectOrder) .then(eatPizza) .catch(failureCallback);
비동기 덩어리를 동기적으로 작성할 수 있어서 좋음.
그렇지만 동시에 완료되면 좋은 여러가지 일이 있다면 (변수에 await Promise를 할당하고 사용하는 방법도 있지만 Promise.all이 있어서) 프로미스가 더 나을지도.
https://developer.mozilla.org/ko/docs/Learn/JavaScript/Asynchronous/Introducing
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://developer.mozilla.org/ko/docs/Learn/JavaScript/Asynchronous/Async_await
https://youtu.be/JB_yU6Oe2eE
https://youtu.be/aoQSOZfz3vQ