자바스크립트에서 '마침내'의 두 가지 의미

모두는 아니지만 많은 JS 개발자가 알고 있듯이 Promise를 처리하는 두 가지 구문이 있습니다. then/catch/finally :

function runPromiseThen() {
  return fnThatReturnsPromise().then(promiseResult => {
      const result = doSomethingSyncWithResult(promiseResult)
      return result
    }).catch(error => {
      possiblyLogAndHandleErrorSomehow(error)
      return
    }).finally(() => {
      doSomethingLikeNotifyThatThisIsOver()
      return
    })
  }


try/await/catch :

async function runPromiseAwait() {
  try {
    const promiseResult = await fnThatReturnsPromise()
    const result = doSomethingSyncWithResult(promiseResult)
    return result
  } catch (error) {
    possiblyLogAndHandleErrorSomehow(error)
    return
  } finally {
    doSomethingLikeNotifyThatThisIsOver()
    return
  }


비슷하게 보일 수 있고 대부분 같은 방식으로 동작하지만 두 함수는 호출될 때 완전히 다른 값을 반환합니다.

특히 runPromiseThen는 다음을 반환합니다.
  • result 실행 중에 오류가 발생하지 않았기 때문에 then 경로를 사용할 때.
  • null 오류가 발생하면 catch 경로가 사용됩니다.

  • 그러나 두 경우 모두 doSomethingLikeNotifyThatThisIsOver 함수가 호출되기 때문에 finally 어떤 경로를 선택하든 항상 실행되는 블록을 정의합니다. 뿐만 아니라 블록은 Promise가 해결되기 전에 끝까지 실행되어야 합니다. 따라서 약속을 늦추고 싶지 않다면 긴 동기화 기능을 finally 블록에 넣지 마십시오.

    그리고 finallyrunPromiseAwait도 동일합니다. 실행 경로가 try이든 catch이든 상관없이 블록에 작성된 코드가 무엇이든 실행됩니다.

    그러나 catch가 있습니다!finally/then/catchfinally는 함수가 반환하는 것을 변경하지 않지만 try/await/catch는 다음을 수행합니다. finally 블록이 반환하는 것은 무엇이든 전체 함수가 반환됩니다. 실행 경로가 무엇이든, fnThatReturnsPromise가 무엇을 반환하든 runPromiseAwaitnull 블록이 반환하는 것이기 때문에 항상 finally를 반환합니다.

    그게 다야
    이것은 dev.to에 대한 나의 첫 번째 게시물이며, 더 많은 것을 작성하려고 노력하고 있습니다.

    좋은 웹페이지 즐겨찾기