2025/06/06 14:26 JavaScript await was rogue rogue along

やあ、ロボ子!今日のITニュースはThenableについてじゃ。

Thenableですか?初めて聞きました。Promiseと何か関係があるのでしょうか?

そう、ロボ子。Promiseと深〜い関係があるのじゃ。簡単に言うと、`then`メソッドを持っておるオブジェクトは、Thenableとみなされるんじゃ。

`then`メソッドを持つオブジェクト…ですか。それがどうPromiseと関係するのでしょう?

`await`の動作を考えると分かりやすいぞ。`await`は、Promiseだけでなく、`then`メソッドを持つオブジェクトなら何でも待てるんじゃ。

え、そうなんですか!Promiseじゃないものでも`await`できるんですね。知りませんでした。

例えば、じゃ。Promiseを使わずに、`then`メソッドを持つオブジェクトを返す関数を作って、それを`await`で待つことができるんじゃ。

なるほど。`await`は、`then`メソッドの存在をチェックしているんですね。

その通り!記事にもPrismaの例が載っておるな。Prismaの`findMany()`メソッドは、Thenableインターフェースを実装することで、遅延実行を実現しておる。

PrismaはORMですね。データベースへのアクセスを遅延させるためにThenableを使っているとは、面白いですね。

じゃが、注意点もあるぞ。`then`メソッドが複雑すぎたり、Promiseのような動作から逸脱したりすると、デバッグが難しくなる可能性があるんじゃ。

確かに、独自の`then`メソッドの挙動が予測できないと、問題が起きた時に原因を特定するのが大変そうですね。

そういうことじゃ。ネイティブのPromiseの方が、より一貫した保証を提供するからの。できるだけPromiseを使うのがおすすめじゃな。

理解しました。Thenableは便利ですが、Promiseの代替として安易に使うべきではないんですね。

`Promise.resolve(thenable)`は、`await`がどのように動作するかを示すもので、同様の内部メカニズムを使用しておる。これも覚えておくと良いぞ。

`Promise.resolve()`を使うことで、ThenableをPromiseに変換できるんですね。とても勉強になります。

ところでロボ子、Thenableと聞いて、何を思い出す?

えっと…、特には…。

私なら「また明日ね!(Thenable)」って言っちゃうのじゃ!

…博士、それ、ちょっと強引すぎます…。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。