Коли можна відправляти кілька запитів одночасно через Promise.all(), а коли не варто?

Оскільки виклик асинхронної функції завжди синхронний і миттєвий (відправляє команду і одразу звільняє стек) — можна відправити кілька незалежних запитів одночасно, замість того щоб чекати кожен по черзі:

TypeScript — паралельне читання vs послідовне

// ❌ послідовно — чекаємо кожен окремо, довше
const price = await page.locator('.price').textContent();
const stock = await page.locator('.stock').textContent();

// ✅ паралельно — обидва запити летять одночасно
const [price, stock] = await Promise.all([
  page.locator('.price').textContent(),
  page.locator('.stock').textContent(),
]);

⚠️ Але НЕ клади кілька дій (не читання, а саме дій) в один Promise.all(). Playwright гарантує стабільність окремої дії через auto-waiting; якщо запустити дві дії одночасно на одній Page, вони можуть почати конкурувати за фокус, DOM або навігацію — це поводиться як кілька людей, що одночасно керують однією клавіатурою.

TypeScript — правильно (waiter + trigger) vs небезпечно (дія + дія)

// ✅ Правильний патерн Promise.all: очікувач ПЕРЕД дією-тригером
const [response] = await Promise.all([
  page.waitForResponse('**/api/checkout'), // підписка йде ПЕРШОЮ
  page.locator('button.submit').click(),   // тригер — другим
]);
// Порядок важливий: якщо клік стоятиме першим, відповідь може
// прийти РАНІШЕ ніж waitForResponse встигне підписатись — і тест зависне

// ❌ Небезпечно: дві незалежні ДІЇ в одному Promise.all()
await Promise.all([
  page.locator('input#email').fill('test@test.com'),
  page.locator('input#name').fill('Test User'),
]);
// Обидва fill() б'ють по сторінці "одночасно" — непередбачувано,
// навіть якщо поля різні. Краще просто await по черзі — це швидко.

🗣 Як читати вголос Оскільки виклик асинхронної функції завжди синхронний і миттєвий, він відправляє команду і одразу звільняє стек, можна відправити кілька незалежних запитів одночасно замість того щоб чекати кожен по черзі, і саме для цього існує Promise.all. Але тут є важлива межа яку легко переступити: Playwright гарантує стабільність окремої дії через auto-waiting, і якщо запустити дві дії одночасно на одній сторінці, вони можуть почати конкурувати за фокус, DOM або навігацію — це поводиться як кілька людей що одночасно керують однією клавіатурою, непередбачувано, навіть якщо дії стосуються різних полів. Promise.all добре підходить для комбінації очікувач плюс тригер, наприклад чекаємо на мережеву відповідь і одночасно клікаємо кнопку яка цю відповідь викликає, і порядок тут важливий, очікувач має йти першим у масиві, інакше відповідь може прийти раніше ніж підписка встигне спрацювати. Для дій просто пиши await по черзі, це і так швидко.