기술면접 - 비동기

Mooby·2023년 3월 26일
0

기술면접

목록 보기
2/6

콜백 함수와 프로미스의 차이점

콜백함수와 프로미스는 둘다 비동기적인 작업을 처리할 때 사용되는 자바스크립트 문법이다.

콜백함수는 일반적으로 다른 함수의 파라미터로 전달되는 함수를 말한다. 비동기 함수에서는 비동기 작업이 완료된 후 실행되는 함수를 말하는데, 간단한 비동기 처리는 콜백함수를 사용해도 아무 상관이 없지만 다뤄야 할 데이터가 많아지면 계속 중첩되어 콜백 헬이 발생하고, 코드의 가독성이 떨어진다. 콜백함수마다 에러 처리를 위한 로직을 작성해줘야하기 때문에 에러 처리가 어렵다.
반면에 프로미스는 콜백함수보다 더 직관적이고 가독성이 높은 비동기 처리 방법이다. 프로미스는 반환되는 프로미스의 상태에 따라 then 메서드와 catch 메서드로 처리 방식이 나뉘는데, 이로 인해 에러 처리가 쉽고, than 메서드를 여러번 호출하는 프로미스 체이닝을 사용하면 콜백함수에 비해 가독성이 향상된다. 또한, Promise.all 메서드를 사용해서 여러 개의 비동기작업을 동시에 쉽게 처리할 수 있다. 하지만 than 메서드의 사용법에 따라 콜백함수와 마찬가지로 중첩되어 가독성이 떨어질 수 있다.

async/await를 사용할 때 에러를 처리하는 방법

async/await는 프로미스를 기반으로 작동하는 문법이므로 프로미스와 같이 catch 메서드를 사용해서 에러를 처리할 수 있다. 기본적으로 프로미스 객체는 에러가 발생했을 때 생성자 함수에서 reject 함수를 호출하여 catch 메서드를 통해 에러를 처리할 수 있지만, async/await 문법에서는 사용 방법이 조금 다르다. async/await에서는 try-catch 블록을 사용하여 에러를 처리하는데, try 블록에서 await 키워드를 사용하여 비동기 함수를 실행시키다가 정해진 로직에 따른 조건을 만족하지 않으면, throw 연산자와 new Error 함수를 이용하여 에러를 발생시키고, 자동으로 catch 블록으로 이동하여 정해진 로직에 따라 에러를 처리하게 된다.

Promise.all과 Promise.race의 차이점

Promise.all과 Promise.race는 둘 다 Promise를 요소로 하는 배열을 다루는 메서드이다. 먼저 Promise.all 메서드는 Promise 배열을 받아 그 배열의 모든 Promise가 resolve 상태가 될 때까지 기다린 후 결과 값을 배열로 반환한다. 반면에 Promise.race 메서드는 Promise 배열을 받아 가장 먼저 resolve된 하나의 Promise의 결과 값만 반환한다. 즉, Promise.all은 배열을 입력받아, 배열을 반환하고, Promise.race는 배열을 입력받아 그 중 가장 빠르게 작업이 완료된 하나의 결과값만 반환한다는 뜻이다. 따라서 Promise.race를 사용하면 여러 Promise들의 작업 시간을 비교하여 가장 빠르게 처리되는 Promise의 결과값만 받을 수 있다.

Promise 객체의 then 메서드에서 또 다른 Promise 객체를 반환하는 동작의 원리

이러한 동작을 Promise chaining이라고 한다. 기본적으로 then 메서드는 항상 새로운 Promise 객체를 반환하도록 되어있다. 이를 통해 then 메서드에서 반환된 Promise 객체에 다시 then 메서드를 호출하여 새로운 Promise 객체를 반환하는 식으로 연결할 수 있다. 이렇게 연결된 Promise 객체는 각각의 비동기적인 작업을 연속적으로 처리할 수 있게 된다. 또한 Promise chaining을 사용하여 반환된 프로미스의 상태, 즉 fulfilled인지 rejected인지에 따라 구분하여 비동기 작업을 계속 진행하거나, 에러를 처리할 수 있다.

profile
코린이

0개의 댓글