Skip to content

flowAsync (関数型プログラミング) ​

左から右へ関数を非同期に合成し、各中間結果を待機する再利用可能な非同期関数を返します。

typescript
const fn = flowAsync(...functions);
const result = await fn(...args);

INFO

flowAsync は flow の Promise 対応版です。flow は各関数の戻り値をそのまま次の関数に渡すため、Promise を返すと未解決のまま渡されてしまいます。flowAsync はすべてのステップを待機するため、同期関数と非同期関数を 1 つのチェーンで自由に混在させられます。

使用法 ​

flowAsync は一連の関数を受け取り、左から右へ 1 つの非同期関数に合成します。最初の関数は任意の数の引数を受け取れますが、それ以降の関数はすべて単項で、直前の関数の結果を待機した値を受け取ります。合成された関数は常に Promise を返します。

typescript
import { flowAsync } from 'es-toolkit/fp';

const fetchUser = async (id: number) => ({ id, name: 'Alice' });
const getName = (user: { name: string }) => user.name;

const getUserName = flowAsync(fetchUser, getName);

await getUserName(1); // => 'Alice'

同期関数と非同期関数は任意の順序で混在できます。各結果は次の関数に渡される前に待機されます。

typescript
import { flowAsync } from 'es-toolkit/fp';

const process = flowAsync(
  (x: number) => x + 1,
  async x => x * 3,
  x => `value: ${x}`
);

await process(1); // => 'value: 6'

いずれかの関数がエラーを投げたり、拒否された Promise を返したりすると、合成された関数もそのエラーで拒否されます。呼び出しを 1 つの try/catch(または .catch)で囲めば、すべてのステップの失敗を処理できます。

typescript
import { flowAsync } from 'es-toolkit/fp';

const risky = flowAsync(
  async (id: number) => {
    throw new Error(`user ${id} not found`);
  },
  (user: { name: string }) => user.name
);

await risky(1); // Error: user 1 not found で拒否されます。

パラメータ ​

  • functions: 左から右へ合成する関数です。最初の関数は任意の数の引数を受け取れますが、残りはすべて単項で、直前の関数の出力を待機した値を受け取ります。

戻り値 ​

すべての関数を順番に適用し、各結果を待機する新しい非同期関数です。最初の関数と同じパラメータを受け取り、最後の関数の結果を待機した値で解決されます。公開されているオーバーロードは、チェーンから正確な型を推論します。

MIT ライセンスの下で配布されています。