🤝

Promise.allを使う際に考慮すべきこと

2023/07/01に公開

記事を書いたきっかけ

発端は以下のツイート

ツイート主の前提

  • Promise.all内の関数に順序の依存関係がない
  • バックエンドがフロントエンドのリクエストを気にせず捌ける(大規模でない?

一般的なPromise.allについて

とりあえずMDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

ユースケース等纏まってはいるが、使用するときは以下の観点で考える

コードに関する観点

パフォーマンス(ツイート主の主張)

Promise.all()は複数のPromiseを並行して実行するため、特にネットワークリクエストなどの待ち時間が長い非同期操作を行う場合、全体の処理時間を大幅に短縮できる

コードの複雑さとPromise Hell(よく伸びている反論)

適切に使用すれば、コードの読みやすさを向上させることができる。しかし、過度にネストすると、「Promise Hell」に陥る可能性がある。
これは、非同期処理が多層にわたるネストとなり、それによってコードが理解しにくく、保守しにくくなる状態を指す。
https://twitter.com/wraith13/status/1674876103306121220?s=20

エラーハンドリング

一つでもPromiseが失敗するとすぐにエラーを投げる。
したがって、特定のPromiseが失敗したときに他のPromiseの結果を保持したい場合は、異なる戦略が必要となる。

バックエンド、サーバーサイド側の観点

リソース使用

大量の非同期処理を同時に実行すると、リソース(ネットワーク、メモリ、CPUなど)が一時的に大量に消費される。
そのため、サーバーやブラウザがその負荷を処理できるかどうか考慮する必要がある。

非同期処理の設計の観点

https://twitter.com/mizchi/status/1675093894231621632?s=20

設計

非同期処理は、主にデータの取得や保存などの操作に対して行うべきで、ビジネスロジックの内部には侵入させないように設計することが重要

テストの観点

非同期APIを値オブジェクトで抽象化し、その結果を模倣することで、テストの可読性、保守性、そして速度を向上させることができる。

感想

ChatGPTに聞きつつ色々なツイートを見てまとめました。
実際のやり取りは以下
https://chat.openai.com/share/67a970b4-4042-4e59-a272-ea01fd43fafc

人類に非同期処理は早すぎた

おまけ

発端となった方のプロダクト
https://twitter.com/plus_one_masaki/status/1674902728932462593?s=20

おまけのおまけ

webフロントエンドの人には役に立つかも...?
https://zenn.dev/tesla/articles/6d17245bc81079

Discussion