【Node.js】return await の紛らわしい注意点
Eslint には no-return-await というルールがある。Standard JS にも採用されているルールだ。このルールは、return await に警告を出す。
async function foo() { return await bar() }
しかし、常に return await しないべきかというとそうでもなくて、必要な場合もある。
それを確かめるべく、まずはエラーを投げる async 関数を作る。
const failAsync = async () => { throw 'Failed' }
これを return await する場合としない場合の関数を書いてみる。
const returnAwait = async () => { try { return await failAsync() } catch (error) { throw 'returnAwait error' } } const noReturnAwait = async () => { try { return failAsync() } catch (error) { throw 'noReturnAwait error' } }
これらは実行時に何か違いがあるだろうか。
;(async () => { try { await returnAwait() } catch (error) { console.error(error) } try { await noReturnAwait() } catch (error) { console.error(error) } })()
実行したときの出力はこうなる。
returnAwait error Failed
おわかりのとおり、noReturnAwait() の中では failAsync() のエラーを捕捉できていない。
return したプロミスがエラーを投げる可能性があるとき、return await しないとエラーを捕捉できないというわけだ。
このように、return await をするかどうかで挙動が異なる場合がある。
Eslint の no-return-await ルールではこれを考慮して、return await が try {} で包まれているときには警告を出さない。