Skip to content

🔗 combineAsyncChunks

combineAsyncChunks merges multiple async chunks into one reactive chunk.
It tracks loading, error, and data states across all sources — perfect for managing multiple parallel API calls.

⚡ Basic Example

ts
import { asyncChunk, combineAsyncChunks } from "stunk";

// User data
const userChunk = asyncChunk(async () => {
  const res = await fetch("/api/user");
  return res.json();
});

// User posts
const postsChunk = asyncChunk(async () => {
  const res = await fetch("/api/posts");
  return res.json();
});

// Combine both
const profileChunk = combineAsyncChunks({
  user: userChunk,
  posts: postsChunk,
});

Now profileChunk is a single reactive chunk with this shape:

ts
{
  loading: boolean;
  error: Error | null;
  errors: Record<string, Error>;
  data: {
    user: User | null;
    posts: Post[] | null;
  };
}

🔁 Reactivity Example

ts
profileChunk.subscribe(({ loading, error, data }) => {
  if (loading) console.log("Loading...");
  else if (error) console.error("Error:", error);
  else console.log("Profile data:", data);
});

✅ Updates automatically when any async chunk changes ✅ Keeps partial results while others are loading ✅ Aggregates errors and loading states cleanly

🧠 Why Use It?

BenefitDescription
🔄 Synchronized LoadingCombines multiple async states into one cohesive view
⚙️ Centralized Error HandlingCollects all errors in one place
💾 Partial Data SupportKeeps old data while new requests load
Full ReactivityAuto-updates when any source chunk updates

Example Use Case

ts
const dashboard = combineAsyncChunks({
  profile: profileChunk,
  stats: statsChunk,
  notifications: notificationsChunk,
});

You can now manage entire dashboard state with one chunk — reactive, efficient, and fully composable. 🚀