JavaScript에서 프로미스 체인의 예외 처리

어떤 이유로든 우리의 프로미스가 오류와 함께 종료된다고 가정해 봅시다:

javascriptlet promise = new Promise(function(resolve, reject) {
  setTimeout(function() {
    reject('error');
  }, 3000);
});

이 경우 코드 실행은 오류 처리 함수가 있는 then 또는 (먼저 만나는 것에 따라) 첫 번째 catch로 즉시 이동합니다.

첫 번째 상황의 예시입니다:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  },
  function(error) {
    // 실행이 여기로 즉시 이동합니다
  }
).then(
  function(result) {
    console.log(result);
  }
);

두 번째 상황의 예시입니다:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  }
).catch(
  function(error) {
    // 실행이 여기로 즉시 이동합니다
  }
).then(
  function(result) {
    console.log(result);
  }
);

처리 함수에는 두 가지 선택지가 있습니다: 예외 상황을 처리할 수 있다면, return을 통해 결과를 반환하고 실행은 체인을 따라 계속 진행됩니다. 오류를 처리할 수 없다면, 아무것도 반환하지 않거나 throw를 통해 예외를 발생시킬 수 있습니다. 이 경우 실행은 다음 오류 핸들러 (먼저 만나는 then 또는 catch)로 이동합니다.

일반적으로 체인의 모든 오류는 한 곳에서 처리됩니다: 체인 끝에 catch를 배치합니다:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  }
).catch(
  function(error) {
    // 오류 발생 시 여기에 도달합니다
  }
);

예외는 프로미스 자체에서 발생하거나 체인의 어떤 부분에서든 throw를 통해 발생시킬 수 있습니다:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    if (allGood) {
      return result + '2';
    } else {
      throw new Error('error'); // 가장 가까운 핸들러로 이동합니다
    }
  }
)
.then(
  function(result) {
    return result + '3';
  }
).catch(
  function(error) {
    // 가장 가까운 핸들러
  }
);

catch는 정확히 오류 진단을 위해 필요하다는 점을 명심하세요: 오류가 해결 가능한지 여부입니다. 오류가 해결 가능하다면, catch는 그 해결책을 바로 다음 then에 전달해야 합니다. 해결할 수 없는 경우 (또는 해당 catch가 해결 방법을 단순히 모르는 경우), 우리는 아무것도 반환하지 않거나 예외를 발생시켜야 합니다:

javascriptpromise.then(
  function(result) {
    return result + '1';
  }
).then(
  function(result) {
    return result + '2';
  }
).catch(
  function(error) {
    if (errorSolvable) {
      return 'data'; // 다음 then으로 보냅니다
    } else {
      // 아무것도 반환하지 않거나 예외를 발생시킵니다
    }
  }
).then(
  function(result) {
    // 여기서 오류를 해결합니다
  }
);