MediumPro challengeJavaScriptTypeScript

Avoid Nested Callbacks

TypeScriptClean CodeAsyncRefactoring

Callback hell makes code impossible to follow and debug.

// dirty — pyramid of doom
function buildPipeline(
  userData: { id: string; name: string },
  ordersData: Array<{ id: string }>,
  productsData: unknown[],
) {
  return new Promise((resolve) => {
    fakeUser(userData, (user: unknown) => {
      fakeOrders(ordersData, (orders: unknown) => {
        fakeProducts(productsData, (products: unknown) => {
          resolve({ user, orders, products });
        });
      });
    });
  });
}

Refactor `solve(userData, ordersData, productsData)` using async/await so the function is flat and readable.
The fake fetchers are already provided as Promises — no callbacks.

solve({ id: 'u1', name: 'Alice' }, [{ id: 'o1' }], [{ id: 'p1' }])Promise<{ user, orders, products }>

Sample tests

Test #1Multiple products
Input: [{"id":"u3","name":"Carol"},[{"id":"o4"}],[{"id":"p2"},{"id":"p3"}]]
Output: {"user":{"id":"u3","name":"Carol"},"orders":[{"id":"o4"}],"products":[{"id":"p2"},{"id":"p3"}]}
Test #2Resolves all three levels and returns combined result
Input: [{"id":"u1","name":"Alice"},[{"id":"o1"}],[{"id":"p1","title":"Book"}]]
Output: {"user":{"id":"u1","name":"Alice"},"orders":[{"id":"o1"}],"products":[{"id":"p1","title":"Book"}]}
Test #3Multiple orders, empty products
Input: [{"id":"u2","name":"Bob"},[{"id":"o2"},{"id":"o3"}],[]]
Output: {"user":{"id":"u2","name":"Bob"},"orders":[{"id":"o2"},{"id":"o3"}],"products":[]}