MediumPro challengeJavaScriptTypeScript

Avoid Nested Callbacks

Clean CodeAsyncRefactoring

Callback hell makes code impossible to follow and debug.

// dirty — pyramid of doom
function buildPipeline(userData, ordersData, productsData) {
  return new Promise((resolve) => {
    fakeUser(userData, (user) => {
      fakeOrders(ordersData, (orders) => {
        fakeProducts(productsData, (products) => {
          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 orders, empty products
Input: [{"id":"u2","name":"Bob"},[{"id":"o2"},{"id":"o3"}],[]]
Output: {"user":{"id":"u2","name":"Bob"},"orders":[{"id":"o2"},{"id":"o3"}],"products":[]}
Test #2Multiple 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 #3Resolves 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"}]}