Sikau

Project: A JavaScript app · Day 5 · about 40 min

Talk to the kitchen

async/await, Promise.all in parallel, and retrying a busy server.

Servers are slow and busy

Real data comes from a server: it takes time, and sometimes it fails. Ask for stock of every dish at the same time with Promise.all, and when the kitchen says *busy*, try again a few times before giving up.

Parallel and retry

async function available() {
  const menu = await fetchMenu();
  const stock = await Promise.all(menu.map((item) => fetchStock(item.id)));
  return menu.filter((item, i) => stock[i].left > 0).map((item) => item.name);
}

async function withRetry(fn, tries) {
  let lastError;
  for (let i = 0; i < tries; i++) {
    try {
      return await fn();
    } catch (err) {
      lastError = err;
    }
  }
  throw lastError;
}

async function placeOrder(order) {
  const reply = await withRetry(() => sendOrder(order), 3);
  return reply.number;
}

The rest of this lesson

  • Pretend servers are honest practiceexplain
  • A reusable retry helperexplain
  • How long?predict
  • Parallel timingpredict
  • Async helperswrite code
  • Badge quizquiz
  • What you builtrecap

Continue this lesson free — run real code in your browser

Continue with Google

See all 6 lessons of Project: A JavaScript app