⛓️

Pipe と AsynPipe の統合 ― r-piprline v2.0.0

に公開

Pipe と AsyncPipe を統合しました

リリース後に、AsyncPipeだけは独立してリリースしてたんですが、そもそもAysncPipeが同期処理も扱えるので、分けた意味が薄め(実際は統合がうまく行かなっただけですが)だったので、2つのPipeを統合して扱える r-pipeline 2.0.0 をリリースしてきました。

https://www.npmjs.com/package/r-pipeline

async のメソッドを同期系の処理無いに埋め込むと、全てにasync汚染が始まってしまうという問題に立ち向かうべく、同期用のPipelineと非同期のPipelineどっちも扱えるようにしました。

とはいえ、制限が無いわけではなく

asyncを含むメソッドを入れた場合は、streamAsync で開始しないとエラーになるようにしています。
途中の戻り値が、Promiseになる場合、Pipe前後の接続型がPromiseによって崩れちゃうからですね。

非同期から同期は呼び出せるので、通常はsyncのPipe、非同期に組み込むときだけasyncのPipeを利用すると、async汚染が抑えられるかと思います。

サンプルコード

Pipeの使い方に関してはここいらを見ていただくとわかるようになってます。

https://github.com/risk/r-pipeline/blob/main/src/examples/standardAsync.ts

このあたりで、同期パイプと非同期パイプをミックスしてつかてますのでご参考まで。
https://github.com/risk/r-pipeline/blob/0654905280d71256445dc88230b1b8bc71f28fdd/src/examples/standardAsync.ts#L72-L108

通常のMix

https://github.com/risk/r-pipeline/blob/0654905280d71256445dc88230b1b8bc71f28fdd/src/examples/standardAsync.ts#L72-L78
ここでは、同期処理 → 非同期処理 → 同期処理 を行っています。
処理の中に、非同期処理が含まれているので、Pipelineを流し始めるには、streamAsyncを利用します。

こんな感じで、stream で処理を行うと、非同期処理の時点でエラー応答が返りますので、

Error: Cannot use thenable function

正しいメソッドで開始していただければと思います。
https://github.com/risk/r-pipeline/blob/0654905280d71256445dc88230b1b8bc71f28fdd/src/examples/standardAsync.ts#L80-L86

こちらのサンプルは、branchを利用した同期パイプを非同期パイプに接続しています。
https://github.com/risk/r-pipeline/blob/0654905280d71256445dc88230b1b8bc71f28fdd/src/examples/standardAsync.ts#L88-L107
接続用のメソッドを切り替えることで、同期パイプを非同期パイプに接続出来ます。
なので、同期パイプで処理をつくっておいて、使うときだけ非同期パイプに繋ぐなんて使い方も出来ます。

Discussion