본문으로 건너뛰기
김신건의 로그

[Javascript] 콜백 지옥

· 수정 · 📖 약 1분 · 159자/단어 #javascript #async #anti-pattern
콜백 지옥, callback hell, 콜백지옥, pyramid of doom, JavaScript callback hell, JS callback hell
  • 콜백 지옥 (callback hell) 또는 둠 피라미드 (pyramid of doom): 순차 의존이 있는 비동기 작업을 콜백 으로 연결할 때 들여쓰기가 오른쪽으로 깊어지는 현상.
  • 가독성 문제가 가장 먼저 보이지만, 더 큰 문제는 에러 처리 다. 매 단계마다 if (err) return 을 빠뜨리면 그대로 무시되고, try/catch 도 통하지 않는다.
// 콜백 지옥의 전형
loadUser(42, (err, user) => {
  if (err) return console.error(err);
  loadPosts(user.id, (err, posts) => {
    if (err) return console.error(err);
    loadComments(posts[0].id, (err, comments) => {
      if (err) return console.error(err);
      loadProfile(comments[0].authorId, (err, profile) => {
        if (err) return console.error(err);
        console.log(profile.name);
      });
    });
  });
});

해결

  • Promise + 체이닝: .then 의 평탄한 흐름으로 펴기
  • async/await: 동기 코드처럼 작성
try {
  const user = await loadUser(42);
  const posts = await loadPosts(user.id);
  const comments = await loadComments(posts[0].id);
  const profile = await loadProfile(comments[0].authorId);
  console.log(profile.name);
} catch (err) {
  console.error(err);
}

참고

이 글의 용어 (3개)
[Javascript] 콜백javascript
- 콜백 (callback): 다른 함수의 인자로 넘겨져, 받은 쪽이 적절한 시점에 호출하는 함수. 일급 함수 () 가 있어야 가능한 패턴이라 JavaScript 에서는 자연스럽…
[Javascript] async/awaitjavascript
정의 / 는 기반 비동기 코드를 마치 동기 코드처럼 쓸 수 있게 해주는 ES2017 의 문법 설탕. 본질은 Promise 그 자체, 문법만 다르다. 전체 동작 메커니즘은 글 참조…
[Javascript] Promisejavascript
정의 Promise 는 미래의 어떤 시점에 결정될 값을 나타내는 객체다. ECMAScript 2015 (ES6) 에 도입되어 기반 비동기의 가독성과 에러 처리 문제를 해결했다. …

이 개념을 다룬 위키 페이지 (2)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기