К ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡŽ

Асинхронный ΠΊΠΎΠ΄: Promise ΠΈ await

ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π΅ останавливаСт страницу ΠΈ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΠ·ΠΆΠ΅.

Ρ‚Π°ΠΊΠΆΠ΅ Π² основах Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ

На этой страницС

Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· сСти, ΠΎΡ‚Π²Π΅Ρ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π΅ сразу. Если Π±Ρ‹ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ останавливал всю страницу Π΄ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π°, ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‚ΠΊΠ° пСрСстали Π±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ JavaScript ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ дСйствия ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΠ·ΠΆΠ΅.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ появится ΠΏΠΎΠ·ΠΆΠ΅

Promise – ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Он ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒΡΡ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΈΠ»ΠΈ с ошибкой. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ setTimeout Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· полсСкунды, Π° Promise сообщаСт, ΠΊΠΎΠ³Π΄Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΎΡΡŒ:

main.js
function wait(milliseconds) {
  return new Promise((resolve) => {
    setTimeout(resolve, milliseconds);
  });
}
 
async function showResult() {
  console.log("Начали ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅");
  await wait(500);
  console.log("ΠŸΠΎΠ»ΡΠ΅ΠΊΡƒΠ½Π΄Ρ‹ ΠΏΡ€ΠΎΡˆΠ»ΠΈ");
}
 
showResult();
console.log("Π­Ρ‚Π° строка выполнится Ρ€Π°Π½ΡŒΡˆΠ΅ окончания оТидания");

Π‘Π½Π°Ρ‡Π°Π»Π° появится «Начали ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅Β», Π·Π°Ρ‚Π΅ΠΌ сообщСниС ΠΏΡ€ΠΎ строку, ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ – Β«ΠŸΠΎΠ»ΡΠ΅ΠΊΡƒΠ½Π΄Ρ‹ ΠΏΡ€ΠΎΡˆΠ»ΠΈΒ». await приостанавливаСт Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ Π²Ρ‹Π·ΠΎΠ² showResult, Π½ΠΎ Π½Π΅ всю страницу. Π‘Π»ΠΎΠ²ΠΎ async ΠΏΠ΅Ρ€Π΅Π΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π΅ await. Вакая функция сама Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Promise.

Если опСрация Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ ошибкой

Π‘Π΅Ρ‚Π΅Π²ΠΎΠΉ запрос ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ. Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибки ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ try ΠΈ catch:

main.js
async function loadProducts() {
  try {
    const response = await fetch("/api/products");
    if (!response.ok) {
      throw new Error("Π‘Π΅Ρ€Π²Π΅Ρ€ Π²Π΅Ρ€Π½ΡƒΠ» ΠΎΡˆΠΈΠ±ΠΊΡƒ");
    }
 
    const products = await response.json();
    console.log(products);
  } catch (error) {
    console.error("НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹", error);
  }
}

fetch отправляСт запрос ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Promise с ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ. response.json() Ρ‚ΠΎΠΆΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Promise: ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚Π΅Π»Π° ΠΎΡ‚Π²Π΅Ρ‚Π° Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ врСмя. АдрСс /api/products здСсь ΠΏΡ€ΠΈΠΌΠ΅Ρ€: Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ΄ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π» Π² вашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, Π½ΡƒΠΆΠ΅Π½ сСрвСрный ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎ этому адрСсу. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° response.ok Π½ΡƒΠΆΠ½Π° ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ HTTP-ΠΎΡ‚Π²Π΅Ρ‚ с ΠΊΠΎΠ΄ΠΎΠΌ ошибки сам ΠΏΠΎ сСбС Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π² catch.

Π’ Next-03 Π²Ρ‹ встрСтитС async Ρƒ сСрвСрной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΡ‹. Π’Π°ΠΌ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ относится ΠΊ сСрвСрной Ρ€Π°Π±ΠΎΡ‚Π΅, Π° идСя Ρ‚Π° ΠΆΠ΅: Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ появится ΠΏΠΎΠ·ΠΆΠ΅. Для подробностСй ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ руководство MDN ΠΏΠΎ промисам ΠΈ Ρ€Π°Π·Π΄Π΅Π» ΠΏΡ€ΠΎ async ΠΈ await.