await/catch を使うときの early return

1 min read読了の目安(約1400字 1

この記事は ポエム です

try/catchで書くとcatchの中で簡単にearly returnできますよね

(async () => {
  try {
    await new Promise((_, reject) => {
      reject('something went wrong!')
    })
  } catch(err) {
    console.log('caught!', err)
    return
  }
  console.log('ok~~')
})()

// caught! something went wrong!

こんな感じ

個人的にtry/catchの見た目が好きじゃないのでなるべく使いたくないってのもありますが、
Promiseにcatch生えてるのにtryする?って思うんですよね

でも単純に書き換えるだけだと

(async () => {
  const ret = await new Promise((_, reject) => {
    reject('something went wrong!')
  }).catch((err) => {
    console.log('caught!', err)
    return
  })
  console.log('ok~~')
})()

// caught! something went wrong!
// ok~~

「ok~~ ☆〜(ゝ。∂)」じゃあないんだよ

でも

(async () => {
  let success = true
  await new Promise((_, reject) => {
    reject('something went wrong!')
  }).catch((err) => {
    console.log('caught!', err)
    success = false
  })
  if(!success) {
    return
  }
  console.log('ok~~')
})()

// caught! something went wrong!

これじゃダサいですよね

だから最善手は、
戻り値のない処理でもなんとかresolve('_')とかやって、
Promise<void>としないように自分ルールを作った上で、

(async () => {
  const ret = await new Promise((_, reject) => {
    // これはresolveすることないですが…
    reject('something went wrong!')
  }).catch((err) => {
    console.log('caught!', err)
  })
  if(!ret) {
    return
  }
  console.log('ok~~')
})()

// caught! something went wrong!

とすることかなって思うんです

でも実態がPromise<void>なのにこれのためにstring返したりするの、
あんまりホメられたことじゃないと思うんですよね

みなさんどうしてるんですか?
やっぱりtry/catchですか?