RxJSについて語るスレ

RxJSについて語るスレッドです。 ちょっとしたTipsや困りごと、バージョンアップの情報など情報交換しましょう!

公式ドキュメンテーション: https://rxjs-dev.firebaseapp.com/
GitHubリポジトリ: https://github.com/ReactiveX/rxjs
日本Angular公式ガイドによるRxJSの基礎ガイド: https://angular.jp/guide/rx-library

1 Like

Observableの変数について、宣言と初期化をよくそのまましてたんですけど、
最近よくtoPromise()を利用した初期化をしてます。

そこで
「同じような取り回しを行う非同期処理だし、asyncパイプで処理するし、toPromise()な変数にも変数末尾にダラーつけたい!」
という気持ちが芽生えてしまったんですけど、変数末尾ダラーが 慣例的にObservableを表す のであれば、toPromise()で値初期化する時、変数末尾にダラーつけるのはおかしいですよね?

userData$ = this.apiService.get('users', 1).toPromise().then(({ data }) => data); // $は非同期を表すものではなくストリームを表すので、これは変じゃのう?というお話
2 Likes

@akai そうですねー $ はObservable型に限定しないと意味ないですね :sweat_smile:
自分も toPromise はよく使いますが、その戻り値を名前つけたいときは 〜〜Promise ってつけちゃうか、 await するからそもそもPromise型じゃない値の名前になります

2 Likes

@lacolaco そうなりますよね〜:tired_face: 自分も頭によぎった末尾ダラーとhogePromiseとで迷ってました!
貴重なご意見ありがとうございます!

ところで Observableは subscribe するまで遅延実行されるから変数として保持しておく利点がありますが、 toPromise() した瞬間に遅延実行も解かれてしまうので、 awaitthen ですぐ戻り値を得たいときまで Observableのまま維持することが多いです。なかなかPromise型で保持することはないですね

3 Likes

うお、脳内では完全にasyncpipeでの描写時に遅延実行されるイメージだったのですがそうなのですね、、、!挙動が変わりうるのでヤバい、、、!

pipe(map(({ data }) => data)って書くためにmapインポートすんのめんどくさいなぁ〜、せやtoPromiseしてthenで整形しちゃおう!」とかいう怠惰な考えがキッカケだったんですがこれはいけないですね!

自分なら整形はthenでやらずにmapでやれとレビューしますね。怠惰な考えより万人への意図の伝わりやすさを優先します。

2 Likes

僕の考えだと、このケースだと this.apiService.get('users', 1) の戻り値がすでに dataを展開した Observable<User[]> になっていないのがそもそもの原因かなーと思います。あんまりAPIのレスポンスの型がどうこうはComponentのレベルで知りたくないですね

2 Likes

thenでやるべきか否かの議論だとさっき述べた通りですが、全体の文脈で言うとapiServiceの戻り値をさらに加工してるのは、lacoの言う通り処理責務の漏洩ですね。
apiService内に閉じてるべきです。

2 Likes