Skip to content

FuturableTask.traverse()

Map an array of values to tasks and execute them sequentially.

Syntax

typescript
FuturableTask.traverse<T, U>(
  values: T[],
  fn: (value: T, index: number) => FuturableTask<U>,
  signal?: AbortSignal
): FuturableTask<U[]>

Parameters

values

Array of values to map over.

fn

Function that maps each value to a FuturableTask. Receives the value and its index.

signal (optional)

AbortSignal for cancellation.

Return Value

A FuturableTask<U[]> that resolves with an array of all results.

Description

Combines mapping and sequential execution. Takes an array of values, applies a function to each to create a task, then executes all tasks sequentially.

Examples

Fetch Users by ID

typescript
const userIds = [1, 2, 3, 4, 5];

const users = await FuturableTask
  .traverse(
    userIds,
    id => FuturableTask.fetch(`/api/users/${id}`)
      .map(res => res.json())
  )
  .run();

Process Files

typescript
const filePaths = ['file1.txt', 'file2.txt', 'file3.txt'];

const contents = await FuturableTask
  .traverse(
    filePaths,
    path => FuturableTask.of(() => readFile(path))
  )
  .run();

With Index

typescript
const items = ['a', 'b', 'c'];

const results = await FuturableTask
  .traverse(
    items,
    (item, index) => FuturableTask.of(() => `${index}: ${item}`)
  )
  .run();
// ['0: a', '1: b', '2: c']

Transform and Save

typescript
const data = [
  { id: 1, name: 'Item 1' },
  { id: 2, name: 'Item 2' }
];

await FuturableTask
  .traverse(
    data,
    item => FuturableTask.of(async () => {
      const transformed = transformItem(item);
      await saveToDatabase(transformed);
      return transformed;
    })
  )
  .run();

With Rate Limiting

typescript
const limiter = FuturableTask.createLimiter(3);

const results = await FuturableTask
  .traverse(
    urls,
    url => limiter(
      FuturableTask.fetch(url).map(r => r.json())
    )
  )
  .run();

Comparison with sequence()

typescript
// traverse - create tasks from values
const result1 = await FuturableTask.traverse(
  [1, 2, 3],
  n => FuturableTask.of(() => n * 2)
).run();

// sequence - execute existing tasks
const tasks = [1, 2, 3].map(n =>
  FuturableTask.of(() => n * 2)
);
const result2 = await FuturableTask.sequence(tasks).run();

// Both produce [2, 4, 6]

See Also

Released under the MIT License.