Skip to content

flowAsync (함수형 프로그래밍) ​

왼쪽에서 오른쪽으로 함수를 비동기로 합성해서, 매 중간 결과를 기다리는 재사용 가능한 비동기 함수를 반환해요.

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

INFO

flowAsync는 flow의 Promise 인식 버전이에요. flow는 각 함수의 반환값을 그대로 다음 함수에 넘기기 때문에, 어떤 함수가 Promise를 반환하면 await되지 않은 상태로 다음 함수에 전달돼요. flowAsync는 매 단계를 기다려서, 동기 함수와 비동기 함수를 한 체인에서 자유롭게 섞어 쓸 수 있어요.

사용법 ​

flowAsync는 여러 함수를 받아서 왼쪽에서 오른쪽으로 하나의 비동기 함수로 합성해요. 첫 번째 함수는 인자를 몇 개든 받을 수 있고, 그 뒤의 함수들은 모두 인자를 하나 받아서 이전 함수의 결과를 기다린 값을 넘겨받아요. 합성된 함수는 항상 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를 반환하면, 합성된 함수도 그 에러로 거부돼요. 호출부를 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 라이선스에 따라 배포됩니다.