Skip to content

flatMap()

Transform the result to another task and flatten the result.

Syntax

typescript
task.flatMap<U>(fn: (value: T) => FuturableTask<U>): FuturableTask<U>

Parameters

fn

A function that takes the task's result and returns a new FuturableTask.

Return Value

A new FuturableTask<U> with the flattened result.

Description

The flatMap() method (also known as chain()) is used when your transformation function returns a FuturableTask instead of a plain value. It automatically flattens the nested task structure.

Examples

Basic Usage

typescript
const task = FuturableTask
  .of(() => 5)
  .flatMap(x => FuturableTask.of(() => x * 2));

await task.run(); // 10

Sequential API Calls

typescript
const getUserPosts = FuturableTask
  .fetch('/api/current-user')
  .map(res => res.json())
  .flatMap(user =>
    FuturableTask.fetch(`/api/users/${user.id}/posts`)
      .map(res => res.json())
  );

Dependent Operations

typescript
const workflow = FuturableTask
  .of(() => validateInput(data))
  .flatMap(validated =>
    FuturableTask.of(() => processData(validated))
  )
  .flatMap(processed =>
    FuturableTask.of(() => saveToDatabase(processed))
  );

Conditional Task Execution

typescript
const task = FuturableTask
  .of(() => checkCache(key))
  .flatMap(cached =>
    cached
      ? FuturableTask.resolve(cached)
      : FuturableTask.fetch(`/api/data/${key}`)
          .map(res => res.json())
  );

Error Handling Chain

typescript
const resilient = FuturableTask
  .fetch('/api/primary')
  .map(res => res.json())
  .flatMap(data => {
    if (data.needsEnrichment) {
      return FuturableTask.fetch('/api/enrich')
        .map(res => res.json())
        .map(enrichment => ({ ...data, ...enrichment }));
    }
    return FuturableTask.resolve(data);
  });

When to Use

Use flatMap() when:

  • The transformation returns a FuturableTask
  • You need sequential dependent operations
  • Conditional task execution based on previous results

Use map() when:

  • The transformation returns a plain value
  • Simple data transformations

Comparison

typescript
// ❌ Wrong - creates nested task
const wrong = FuturableTask
  .of(() => 5)
  .map(x => FuturableTask.of(() => x * 2));
// Type: FuturableTask<FuturableTask<number>>

// ✅ Correct - flattens automatically
const correct = FuturableTask
  .of(() => 5)
  .flatMap(x => FuturableTask.of(() => x * 2));
// Type: FuturableTask<number>

See Also

Released under the MIT License.