From Philip

3. DOM optimization (events delegation, batches, doc fragment, throttle, debounce, unsubscribe, remove DOM refs in variables)

events delegation

ВсплытиС ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ событий позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых Π²Π°ΠΆΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΡ‘ΠΌΠΎΠ² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ – Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

ИдСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ссли Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ элСмСнтов, события Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‚ΠΎ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ, ΠΌΡ‹ ставим ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π° ΠΈΡ… ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ°.

Из Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ элСмСнт event.target, ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ событиС ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

table.onclick = function(event) {
  let td = event.target.closest('td'); // (1)

  if (!td) return; // (2)

  if (!table.contains(td)) return; // (3)

  highlight(td); // (4)
};

Π Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  1. ΠœΠ΅Ρ‚ΠΎΠ΄ elem.closest(selector) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ блиТайшСго ΠΏΡ€Π΅Π΄ΠΊΠ°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ сСлСктору. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ <td>, находящийся Π²Ρ‹ΡˆΠ΅ ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ ΠΎΡ‚ исходного элСмСнта.

  2. Если event.target Π½Π΅ содСрТится Π²Π½ΡƒΡ‚Ρ€ΠΈ элСмСнта <td>, Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² Π²Π΅Ρ€Π½Ρ‘Ρ‚ null, ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚.

  3. Если Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅, event.target ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ элСмСнт <td>, находящийся Π²Π½Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ это <td> нашСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

  4. И Ссли это Ρ‚Π°ΠΊ, Ρ‚ΠΎ подсвСчиваСм Π΅Π³ΠΎ.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ ΠΊΠΎΠ΄ подсвСтки, быстрый ΠΈ эффСктивный, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½Π΅ Π²Π°ΠΆΠ½ΠΎ, сколько всСго Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ <td>.

doc fragment

documentFragment - "Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°" Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π±Π»ΠΈΠ·ΠΎΠΊ ΠΏΠΎ смыслу ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ DOM-элСмСнту.

Π’ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ‡ΠΊΡƒ ΡƒΠ·Π»ΠΎΠ² Π΅Π΄ΠΈΠ½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ DocumentFragment. Π­Ρ‚ΠΎ особСнный кросс-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹ΠΉ DOM-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ DOM-ΡƒΠ·Π΅Π», Π½ΠΎ ΠΈΠΌ Π½Π΅ являСтся.

Бинтаксис для Π΅Π³ΠΎ создания:

var fragment = document.createDocumentFragment();

Π’ Π½Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΡƒΠ·Π»Ρ‹.

fragment.appendChild(node);

Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ:

fragment.cloneNode(true); // ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с подэлСмСнтами

Π£ DocumentFragment Π½Π΅Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… свойств DOM-ΡƒΠ·Π»ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ innerHTML, tagName ΠΈ Ρ‚.ΠΏ. Π­Ρ‚ΠΎ Π½Π΅ ΡƒΠ·Π΅Π».

Π•Π³ΠΎ «Ѐишка» Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° DocumentFragment вставляСтся Π² DOM – Ρ‚ΠΎ ΠΎΠ½ исчСзаСт, Π° вмСсто Π½Π΅Π³ΠΎ Π²ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π΅Π³ΠΎ Π΄Π΅Ρ‚ΠΈ. Π­Ρ‚ΠΎ свойство являСтся ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ DocumentFragment.

НапримСр, Ссли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² Π½Π΅Π³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ LI, ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ul.appendChild(fragment), Ρ‚ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ растворится, ΠΈ Π² DOM вставятся ΠΈΠΌΠ΅Π½Π½ΠΎ LI, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Ρ‹Π»ΠΈ Π²ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅.

ПсСвдокод:

// Ρ…ΠΎΡ‚ΠΈΠΌ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² список UL ΠΌΠ½ΠΎΠ³ΠΎ LI

// Π΄Π΅Π»Π°Π΅ΠΌ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ DocumentFragment
var fragment = document.createDocumentFragment();

for (Ρ†ΠΈΠΊΠ» ΠΏΠΎ li) {
  fragment.appendChild(list[i]); // Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ LI Π² DocumentFragment
}

ul.appendChild(fragment); // вмСсто Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° вставятся элСмСнты списка\

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ: Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΏΡ€ΠΈ использовании «портится». Π’ΠΎΡ‡Π½Π΅Π΅ β€” ΠΎΠΏΡƒΡΡ‚ΠΎΡˆΠ°Π΅Ρ‚ΡΡ. Когда ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ div.appendChild(fragment), всС Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ элСмСнты Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° пСрСносятся Π² div. А ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ элСмСнт Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ родитСля, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΈΠ· Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° ΠΈΠ·Ρ‹ΠΌΠ°ΡŽΡ‚ΡΡ! Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этого повСдСния Π² случаС, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ΠΎ Π½Π΅ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ cloneNode.

throttle and debounce

Π’Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ функция вызываСтся Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π° Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ€Π°Π· Π² 10 сСкунд). Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами ― Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ запуск Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ссли ΠΎΠ½Π° ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡΠΊΠ°Π»Π°ΡΡŒ Π½Π΅Π΄Π°Π²Π½ΠΎ. Π’Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ Ρ‚Π°ΠΊΠΆΠ΅ обСспСчиваСт Ρ€Π΅Π³ΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ.

Debouncing Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ прСкратятся Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Волько послС этого функция Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π°. НапримСр, Ссли ΠΌΡ‹ установим Ρ‚Π°ΠΉΠΌΠ΅Ρ€ Π½Π° 2 сСкунды, Π° функция вызываСтся 10 Ρ€Π°Π· с ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠΌ Π² ΠΎΠ΄Π½Ρƒ сСкунду, Ρ‚ΠΎ фактичСский Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ спустя 2 сСкунды послС ΠΊΡ€Π°ΠΉΠ½Π΅Π³ΠΎ (дСсятого) обращСния ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅: Π²ΠΈΠ΄Π΅ΠΎ ΠΈΠ³Ρ€Ρ‹(Ρ‚Ρ€ΠΎΡ‚Ρ‚Π»ΠΈΠ½Π³ для выстрСла Π² 1 сСк ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·), Π°Π²Ρ‚ΠΎΠ·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅(Ссли Π±Ρ‹ Π½Π΅ debounce АPI дСргался Π±Ρ‹ послС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹)

4. event.stopPropagation() vs event.preventDefault()

event.stopPropagation()

ВсплытиС ΠΈΠ΄Ρ‘Ρ‚ с Β«Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎΒ» элСмСнта прямо Π½Π°Π²Π΅Ρ€Ρ…. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ событиС Π±ΡƒΠ΄Π΅Ρ‚ Π²ΡΠΏΠ»Ρ‹Π²Π°Ρ‚ΡŒ Π΄ΠΎ элСмСнта <html>, Π° Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° document, Π° ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ Π΄ΠΎ window, вызывая всС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π° своём ΠΏΡƒΡ‚ΠΈ.

Но любой ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ событиС ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ, ΠΈ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ всплытиС.

Для этого Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ event.stopPropagation().

Если Ρƒ элСмСнта Π΅ΡΡ‚ΡŒ нСсколько ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π° ΠΎΠ΄Π½ΠΎ событиС, Ρ‚ΠΎ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΠΈ всплытия всС ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹.

Π’ΠΎ Π΅ΡΡ‚ΡŒ, event.stopPropagation() прСпятствуСт ΠΏΡ€ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡŽ события дальшС, Π½ΠΎ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ элСмСнтС всС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Π½Ρ‹.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, сущСствуСт ΠΌΠ΅Ρ‚ΠΎΠ΄ event.stopImmediatePropagation(). Он Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ всплытиС, Π½ΠΎ ΠΈ останавливаСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ событий Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ элСмСнтС.

event.preventDefault()

ДСйствия Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

МногиС события автоматичСски Π²Π»Π΅ΠΊΡƒΡ‚ Π·Π° собой дСйствиС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°.

НапримСр:

  • Клик ΠΏΠΎ ссылкС ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ URL.

  • НаТатиС Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΒ» Π² Ρ„ΠΎΡ€ΠΌΠ΅ – отсылку Π΅Ρ‘ Π½Π° сСрвСр.

  • Π—Π°ΠΆΠ°Ρ‚ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΌΡ‹ΡˆΠΈ Π½Π°Π΄ тСкстом ΠΈ Π΅Ρ‘ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ‚Π°ΠΊΠΎΠΌ состоянии – ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅.

Если ΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ событиС Π² JavaScript, Ρ‚ΠΎ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Ρ‚Π°ΠΊΠΎΠ΅ дСйствиС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

Π•ΡΡ‚ΡŒ Π΄Π²Π° способа ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ дСйствиС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°:

  • Основной способ – это Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ event. Для ΠΎΡ‚ΠΌΠ΅Π½Ρ‹ дСйствия Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° сущСствуСт стандартный ΠΌΠ΅Ρ‚ΠΎΠ΄ event.preventDefault().

  • Если ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Ρ‡Π΅Ρ€Π΅Π· on<событиС> (Π½Π΅ Ρ‡Π΅Ρ€Π΅Π· addEventListener), Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ false ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ ΠΏΠΎ ссылкС ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚:

<a href="/" onclick="return false">НаТми здСсь</a>
ΠΈΠ»ΠΈ
<a href="/" onclick="event.preventDefault()">здСсь</a>

5. ВсплытиС/ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅/ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ события

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ DOM Events описываСт 3 Ρ„Π°Π·Ρ‹ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° события:

  1. Π€Π°Π·Π° погруТСния (capturing phase) – событиС сначала ΠΈΠ΄Ρ‘Ρ‚ свСрху Π²Π½ΠΈΠ·.

  2. Π€Π°Π·Π° Ρ†Π΅Π»ΠΈ (target phase) – событиС достигло Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ(исходного) элСмСнта.

  3. Π€Π°Π·Π° всплытия (bubbling stage) – событиС Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²ΡΠΏΠ»Ρ‹Π²Π°Ρ‚ΡŒ.

ΠŸΡ€ΠΈ наступлСнии события – самый Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ элСмСнт, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ, помСчаСтся ΠΊΠ°ΠΊ Β«Ρ†Π΅Π»Π΅Π²ΠΎΠΉΒ» (event.target).

  • Π—Π°Ρ‚Π΅ΠΌ событиС сначала двигаСтся Π²Π½ΠΈΠ· ΠΎΡ‚ корня Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊ event.target, ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ вызывая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, поставлСнныС Ρ‡Π΅Ρ€Π΅Π· addEventListener(...., true), Π³Π΄Π΅ true – это сокращСниС для {capture: true}.

  • Π”Π°Π»Π΅Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΌ элСмСнтС.

  • Π”Π°Π»Π΅Π΅ событиС двигаСтся ΠΎΡ‚ event.target Π²Π²Π΅Ρ€Ρ… ΠΊ ΠΊΠΎΡ€Π½ΡŽ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°, ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ вызывая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, поставлСнныС Ρ‡Π΅Ρ€Π΅Π· on<event> ΠΈ addEventListener Π±Π΅Π· Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈΠ»ΠΈ с Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ Ρ€Π°Π²Π½Ρ‹ΠΌ false.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ свойствам события event:

  • event.target – самый Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠΉ элСмСнт, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ событиС.

  • event.currentTarget (=this) – элСмСнт, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сработал ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ (Ρ‚ΠΎΡ‚, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ «висит» ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ)

  • event.eventPhase – Π½Π° ΠΊΠ°ΠΊΠΎΠΉ Ρ„Π°Π·Π΅ ΠΎΠ½ сработал (ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅=1, Ρ„Π°Π·Π° Ρ†Π΅Π»ΠΈ=2, всплытиС=3).

Π›ΡŽΠ±ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ событиС Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ event.stopPropagation(), Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ это Π½Π΅ рСкомСндуСтся, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² дальнСйшСм это событиС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ, ΠΈΠ½ΠΎΠ³Π΄Π° для самых Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹Ρ… Π²Π΅Ρ‰Π΅ΠΉ.

Π˜Ρ‚Π°ΠΊ, ΠΏΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π½Π° <td> событиС ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ сначала Π²Π½ΠΈΠ· ΠΊ элСмСнту (погруТаСтся), Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ½ΠΎ достигаСт Ρ†Π΅Π»Π΅Π²ΠΎΠΉ элСмСнт (Ρ„Π°Π·Π° Ρ†Π΅Π»ΠΈ), Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΠ΄Ρ‘Ρ‚ Π½Π°Π²Π΅Ρ€Ρ… (всплытиС), вызывая ΠΏΠΎ ΠΏΡƒΡ‚ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ.

ВсплытиС ΠΈΠ΄Ρ‘Ρ‚ прямо Π½Π°Π²Π΅Ρ€Ρ…. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ событиС Π±ΡƒΠ΄Π΅Ρ‚ Π²ΡΠΏΠ»Ρ‹Π²Π°Ρ‚ΡŒ Π½Π°Π²Π΅Ρ€Ρ… ΠΈ Π½Π°Π²Π΅Ρ€Ρ…, Π΄ΠΎ элСмСнта <html>, Π° Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎ document, Π° ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Π°ΠΆΠ΅ Π΄ΠΎ window, вызывая всС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π° своём ΠΏΡƒΡ‚ΠΈ.

Но любой ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ событиС ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ, ΠΈ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ всплытиС.

Для остановки всплытия Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ event.stopPropagation().

Π§Π°Ρ‰Π΅ всСго Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎ всплытии, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ стадии, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈ проходят Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ для нас.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· on<event>-свойство ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· HTML-Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· addEventListener(event, handler) с двумя Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°ΡŽΡ‚ ΠΎ Ρ„Π°Π·Π΅ погруТСния, Π° Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° 2-ΠΎΠΉ ΠΈ 3-Π΅ΠΉ Ρ„Π°Π·Π°Ρ….

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΉΠΌΠ°Ρ‚ΡŒ событиС Π½Π° стадии погруТСния, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ capture Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

elem.addEventListener(..., {capture: true})
// ΠΈΠ»ΠΈ просто "true", ΠΊΠ°ΠΊ сокращСниС для {capture: true}
elem.addEventListener(..., true)

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΠΏΡ†ΠΈΠΈ capture:

  • Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ false (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), Ρ‚ΠΎ событиС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΉΠΌΠ°Π½ΠΎ ΠΏΡ€ΠΈ всплытии.

  • Если Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ true, Ρ‚ΠΎ событиС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΡŒ ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ сущСствуСт 3 Ρ„Π°Π·Ρ‹, 2-ΡƒΡŽ Ρ„Π°Π·Ρƒ (Β«Ρ„Π°Π·Ρƒ Ρ†Π΅Π»ΠΈΒ»: событиС достигло элСмСнта) нСльзя ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, ΠΏΡ€ΠΈ Π΅Ρ‘ достиТСнии Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ всС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ: ΠΈ Π½Π° всплытиС, ΠΈ Π½Π° ΠΏΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅.

6. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅/навигация ΠΏΠΎ DOM

OR

node.parentNode; // Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π» 
node.previousSibling; // ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ, Π½Π° этом ΠΆΠ΅ ΡƒΡ€ΠΎΠ²Π½Π΅, ΡƒΠ·Π΅Π» 
node.nextSibling; // ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ, Π½Π° этом ΠΆΠ΅ ΡƒΡ€ΠΎΠ²Π½Π΅, ΡƒΠ·Π΅Π» 
node.firstChild; // ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт 
node.lastChild; // послСдний Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ элСмСнт

JS:

1. Modules types in JS

ΠœΠΎΠ΄ΡƒΠ»ΠΈ β€” это ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ… ΠΈ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… языках ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ с 60-Ρ… ΠΈ 70-Ρ… Π³ΠΎΠ΄ΠΎΠ².

Π’ ΠΈΠ΄Π΅Π°Π»Π΅, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ JavaScript ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π½Π°ΠΌ:

  • Π°Π±ΡΡ‚Ρ€Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, пСрСдавая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности сторонним Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½Π΅ придётся Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π²ΠΎ всСх слоТностях ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ;

  • ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, скрывая Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ модуля, Ссли Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ измСняли;

  • ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, избавляясь ΠΎΡ‚ нСобходимости ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ снова ΠΈ снова;

  • ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ зависимостями, Π»Π΅Π³ΠΊΠΎ измСняя зависимости Π±Π΅Π· нСобходимости ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ наш ΠΊΠΎΠ΄.

Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ

Π€ΠΎΡ€ΠΌΠ°Ρ‚ модуля β€” это синтаксис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π΅Π³ΠΎ опрСдСлСния.

Π”ΠΎ создания ECMAScript 6, ΠΈΠ»ΠΈ ES2015, Π² JavaScript Π½Π΅ Π±Ρ‹Π»ΠΎ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ синтаксиса для опрСдСлСния ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. А Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π»ΠΈ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ опрСдСлСния.

Π’ΠΎΡ‚ нСсколько Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ извСстных ΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ…:

  • асинхронноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ модуля (Asynchronous Module Definition ΠΈΠ»ΠΈ AMD);

  • CommonJS;

  • ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ модуля (Universal Module Definition ΠΈΠ»ΠΈ UMD);

  • System.register;

  • Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ модуля ES6.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ смогли Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ синтаксису.

АсинхронноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ модуля (AMD)

Π€ΠΎΡ€ΠΌΠ°Ρ‚ AMD ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… ΠΈ примСняСт для опрСдСлСния ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ define:

//Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ define с массивом зависимостСй ΠΈ Ρ„Π°Π±Ρ€ΠΈΡ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ
define(['dep1', 'dep2'], function (dep1, dep2) {

    //ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ модуля с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния
    return function () {};
});

Π€ΠΎΡ€ΠΌΠ°Ρ‚ CommonJS

Π€ΠΎΡ€ΠΌΠ°Ρ‚ CommonJS примСняСтся Π² Node.js ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ для опрСдСлСния зависимостСй ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ require ΠΈ module.exports:

var dep1 = require('./dep1');  
var dep2 = require('./dep2');

module.exports = function(){  
 // ...
}

Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ модуля (UMD)

Π€ΠΎΡ€ΠΌΠ°Ρ‚ UMD ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован ΠΊΠ°ΠΊ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅, Ρ‚Π°ΠΊ ΠΈ Π² Node.js.

(function (root, factory) {
 if (typeof define === 'function' && define.amd) {
   // AMD. ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠ³ΠΎ модуля
     define(['b'], factory);
 } else if (typeof module === 'object' && module.exports) {
   // Node. НС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с CommonJS Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, 
   // Ρ‚ΠΎΠ»ΡŒΠΊΠΎ CommonJS-ΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ срСдами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚      

   // module.exports, ΠΊΠ°ΠΊ Node.
   module.exports = factory(require('b'));
 } else {
   // Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° (root это window)
   root.returnExports = factory(root.b);
 }
}(this, function (b) {
 //ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ b.

 // ΠŸΡ€ΠΎΡΡ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для опрСдСлСния модуля.
 // Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π½ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ 
 // ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ экспортируСмоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
 return {};
}));

System.registerА

Π€ΠΎΡ€ΠΌΠ°Ρ‚ System.register Π±Ρ‹Π» Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ синтаксиса ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ES6 Π² ES5:

import { p as q } from './dep';

var s = 'local';

export function func() {  
 return q;
}

export class C {  
}

Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ES6

Π’ ES6 JavaScript ΡƒΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½ export для экспорта ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ API модуля:

// lib.js

// Экспорт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
export function sayHello(){  
 console.log('Hello');
}

// НС экспоруСмая функция
function somePrivateFunction(){  
 // ...
}

ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ import для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° частСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ экспортируСт:

import { sayHello } from './lib';

sayHello();  
// Hello

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚Ρƒ алиас, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ as:

import { sayHello as say } from './lib';

say();  
// Hello

ΠΈΠ»ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ сразу вСсь ΠΌΠΎΠ΄ΡƒΠ»ΡŒ:

import * as lib from './lib';

lib.sayHello();  
// Hello

Π€ΠΎΡ€ΠΌΠ°Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ экспорт ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

// lib.js

// Экспорт Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
export default function sayHello(){  
 console.log('Hello');
}

// Экспорт Π½Π΅Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
export function sayGoodbye(){  
 console.log('Goodbye');
}

ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ:

import sayHello, { sayGoodbye } from './lib';

sayHello();  
// Hello

sayGoodbye();  
// Goodbye

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ ΠΈ всё, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΆΠ΅Π»Π°Π΅Ρ‚Π΅:

// lib.js

// Экспорт Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
export default function sayHello(){  
 console.log('Hello');
}

// Экспорт Π½Π΅Π΄Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
export function sayGoodbye(){  
 console.log('Goodbye');
}

//  Экспорт простого значСния
export const apiUrl = '...';

// Экспорт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°
export const settings = {  
 debug: true
}

К соТалСнию, Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΏΠΎΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π½Π΅ всС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ES6 ΡƒΠΆΠ΅ сСгодня, Π½ΠΎ для этого потрСбуСтся компилятор Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ Babel, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ наш ΠΊΠΎΠ΄ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ES5, Ρ‚Π°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ AMD ΠΈΠ»ΠΈ CommonJS, ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅.

2. Encapsulation in JS

ΠšΠ»Π°ΡΡΡ‹ Get, Set in object Π—Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅

3. Immutability, types, prevent object from writing

const object

Π’Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ let ΠΈ var, Π½ΠΎ Π²Ρ‹ всС Ρ€Π°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ свойства, ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ свойство ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свойство.

Object.preventExtensions(myObject)

Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… свойств ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… свойств ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ.

Object.seal(myObject)

Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… свойств Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… свойств ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ.

Object.freeze(myObject)

Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π‘ Π·Π°ΠΌΠΎΡ€Π°ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ Π²Ρ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ измСнился Π² вашСм ΠΊΠΎΠ΄Π΅.

4. Property descriptors

ΠœΠ΅Ρ‚ΠΎΠ΄ Object.defineProperty - позволяСт ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ свойствам Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ настройки (ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ свойство ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ, ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΈ Π΄Ρ€.)

var o = {};

o.a = 1;
// Π­ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΎ записи:
Object.defineProperty(o, 'a', {
  value: 1,
  writable: true,
  configurable: true,
  enumerable: true
});


// Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны,
Object.defineProperty(o, 'a', { value: 1 });

// эквивалСнтно записи:
Object.defineProperty(o, 'a', {
  value: 1,
  writable: false,
  configurable: false,
  enumerable: false
});

Бинтаксис

Object.defineProperty(ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, 'имя свойства', дСскриптор);

ДСскриптор - это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ свойства. Π’ Π½Π΅ΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ свойства (Π² скобках ΡƒΠΊΠ°Π·Π°Π½Ρ‹ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ):

value //Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства (undefined)
writable //Ссли true - свойство ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ (false)
configurable // Ссли true, Ρ‚ΠΎ свойство ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ (false)
enumerable //Ссли true, Ρ‚ΠΎ свойство Π²ΠΈΠ΄Π½ΠΎ Π² Ρ†ΠΈΠΊΠ»Π΅ for..in (false)
get //Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства (undefined)
set //Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая записываСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства (undefined);

Если со свойством произвСсти Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π½ΠΎΠ΅ дСйствиС, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ writable = false, Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ (Π° Π² строгом Ρ€Π΅ΠΆΠΈΠΌΠ΅ (ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ 'use strict') - Π±ΡƒΠ΄Π΅Ρ‚ ошибка). Π’Π°ΠΊΠΆΠ΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ value/writeble Ссли ΡƒΠΊΠ°Π·Π°Π½Ρ‹ get/set.

ДСскриптор свойства – это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ JavaScript-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ свойства.

ДСскрипторы свойств, ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ…, Π±Ρ‹Π²Π°ΡŽΡ‚ Π΄Π²ΡƒΡ… основных Ρ‚ΠΈΠΏΠΎΠ²: дСскрипторы Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ дСскрипторы доступа.

ДСскриптор Π΄Π°Π½Π½Ρ‹Ρ… - это свойство, ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ (Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ) записываСмым.

ДСскриптор доступа - это свойство, описываСмоС ΠΏΠ°Ρ€ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ - Π³Π΅Ρ‚Ρ‚Π΅Ρ€ΠΎΠΌ ΠΈ сСттСром.

ДСскриптор ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· этих Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ². Он Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠ±ΠΎΠΈΠΌΠΈ.

И дСскриптор Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈ дСскриптор доступа ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. Бвойства configurable ΠΈ enumerable ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‰ΠΈΠΌΠΈ для дСскриптора Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ для дСскриптора доступа, value ΠΈ writable относятся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ дСскриптору Π΄Π°Π½Π½Ρ‹Ρ…, Π° get ΠΈ set - ΠΊ дСскриптору доступа. ДСскриптор Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ относится ΠΊ ΠΎΠ±ΠΎΠΈΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

6. Constructor

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ-конструкторы ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌΠΈ функциями. Но Π΅ΡΡ‚ΡŒ Π΄Π²Π° соглашСния:

  1. Имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-конструктора Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с большой Π±ΡƒΠΊΠ²Ρ‹.

  2. Ѐункция-конструктор Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° "new".

НапримСр:

function User(name) {
  this.name = name;
  this.isAdmin = false;
}

let user = new User("Вася");

alert(user.name); // Вася
alert(user.isAdmin); // false

Когда функция вызываСтся ΠΊΠ°ΠΊ new User(...), происходит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  1. Боздаётся Π½ΠΎΠ²Ρ‹ΠΉ пустой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈ ΠΎΠ½ присваиваСтся this.

  2. ВыполняСтся ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ this, добавляСт Ρ‚ΡƒΠ΄Π° Π½ΠΎΠ²Ρ‹Π΅ свойства.

  3. ВозвращаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ this.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ конструкторы для создания мноТСства ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

7. Prototype

ВсС, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Ρ‚.Π΅. всС ΠΊΡ€ΠΎΠΌΠ΅:

  • undefined

  • null

  • boolean

  • number

  • string

  • Symbol

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ конструктор ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ св-Π²ΠΎ prototype. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, созданный конструктором, содСрТит ссылку Π½Π° свойство prototype своСго конструктора. Π­Ρ‚Π° ссылка хранится Π² свойствС __proto__. obj.toString() - строка, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Promise / Async / Ajax / Fetch

Callback => Promise => Async Await AJAX(XMLHTTPRequest) => Fetch Promise – это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит своё состояниС. Π’Π½Π°Ρ‡Π°Π»Π΅ pending (Β«ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅Β»), Π·Π°Ρ‚Π΅ΠΌ – ΠΎΠ΄Π½ΠΎ ΠΈΠ·: fulfilled (Β«Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΒ») ΠΈΠ»ΠΈ rejected (Β«Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ с ошибкой»). ΠšΡ€ΠΎΠΌΠ΅ status ΠΈΠΌΠ΅Π΅Ρ‚ ΠΈ value. ΠŸΡ€ΠΈ коллбэках Π±Ρ‹Π»Π° огромная Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ ΠΏΠΈΡ€Π°ΠΌΠΈΠ΄ ΠΈΠ· }) Π² ΠΊΠΎΠ½Ρ†Π΅. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ случаи принято Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ Callback Hell ΠΈΠ»ΠΈ Pyramid of Doom. Π’ΠΎΡ‚ основныС нСдостатки:

  • Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ слоТно Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ.

  • Π’ Ρ‚Π°ΠΊΠΎΠΌ ΠΊΠΎΠ΄Π΅ слоТно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ «качСство».

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² JavaScript Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½Ρ‹ промисы (Π°Π½Π³Π». promises). Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π³Π»ΡƒΠ±ΠΎΠΊΡƒΡŽ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒ коллбэков ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом then:

queryDatabase({ username: 'Arfat'})
  .then((user) => {
    const image_url = user.profile_img_url;
    return getImageByURL('someServer.com/q=${image_url}') 
      .then(image => transformImage(image))
      .then(() => sendEmail(user.email))
})
.then(() => logTaskInFile('...'))
.catch(() => handleErrors()) // ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ошибок

Код стал Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ свСрху Π²Π½ΠΈΠ·, Π° Π½Π΅ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ Π² случаС с ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ. Π­Ρ‚ΠΎ плюс ΠΊ читаСмости. Однако ΠΈ Ρƒ промисов Π΅ΡΡ‚ΡŒ свои ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

  • Всё Π΅Ρ‰Ρ‘ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΊΡƒΡ‡Π΅ΠΉ .then.

  • ВмСсто ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ try/catch Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ .catch для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ всСх ошибок.

  • Π Π°Π±ΠΎΡ‚Π° с нСсколькими промисами Π² Ρ†ΠΈΠΊΠ»Π΅ Π½Π΅ всСгда ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятна ΠΈ мСстами слоТна.

Async/Await

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ async-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² ES2017 (ES8) сдСлало Ρ€Π°Π±ΠΎΡ‚Ρƒ с промисами Π»Π΅Π³Ρ‡Π΅.

  • Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ async-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎΠ²Π΅Ρ€Ρ… промисов.

  • Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ концСпциями.

  • Async-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π±Ρ‹Π»ΠΈ Π·Π°Π΄ΡƒΠΌΠ°Π½Ρ‹ ΠΊΠ°ΠΊ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° ΠΊΠΎΠ΄Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΌΡƒ промисы.

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ async/await, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ использованиС Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ промисов.

  • Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ async-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ с асинхронным ΠΊΠΎΠ΄ΠΎΠΌ Π² синхронном стилС.

ЦСль Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ async/await ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ использованиС promises синхронно ΠΈ воспроизвСсти Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ дСйствиС Π½Π°Π΄ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ Promises.

Бинтаксис состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов: async ΠΈ await. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ асинхронной. ИмСнно Π² Ρ‚Π°ΠΊΠΈΡ… функциях Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ использованиС await. ИспользованиС await Π² любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ случаС Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

// Π’ объявлСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
async function myFn() {
  // await ...
}

// Π’ стрСлочной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
const myFn = async () => {
  // await ...
}

function myFn() {
  // await fn(); (синтаксичСская ошибка, Ρ‚. ΠΊ. Π½Π΅Ρ‚ async)
}

Async-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² JavaScript, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ:

Async-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ промисы

async function fn() {
  return 'hello';
}
fn().then(console.log)
// hello

Ѐункция fn Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строку 'hello'. Π’. ΠΊ. это асинхронная функция, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ строки обёртываСтся Π² промис (с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора).

Код Π²Ρ‹ΡˆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈ Π±Π΅Π· использования async:

function fn() {
  return Promise.resolve('hello');
}
fn().then(console.log);
// hello

Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, вмСсто async, ΠΊΠΎΠ΄ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ промис.

Π§Ρ‚ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ асинхронной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ какая-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ошибка?

async function foo() {
  throw Error('bar');
}

foo().catch(console.log);

Если ошибка Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π°, foo() Π²Π΅Ρ€Π½Ρ‘Ρ‚ промис с Ρ€Π΅Π΄ΠΆΠ΅ΠΊΡ‚ΠΎΠΌ. Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС вмСсто Promise.resolve вСрнётся Promise.reject, содСрТащий ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Ѐункция async ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ await, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ приостанавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ async ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Promise, Π·Π°Ρ‚Π΅ΠΌ возобновляя Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ async ΠΈ возвращая ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово await допустимо Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² асинхронных функциях.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1

Если Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ являСтся промисом, Ρ‚ΠΎ async-функция Π±ΡƒΠ΄Π΅Ρ‚ приостановлСна Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° промис Π½Π΅ выполнится. Если ΠΆΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ являСтся промисом, Ρ‚ΠΎ ΠΎΠ½ΠΎ конвСртируСтся Π² промис Ρ‡Π΅Ρ€Π΅Π· Promise.resolve ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ.

// Ѐункция Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ
// с Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ΠΌ случайного числа
const delayAndGetRandom = (ms) => {
  return new Promise(resolve => setTimeout(
    () => {
      const val = Math.trunc(Math.random() * 100);
      resolve(val);
    }, ms
  ));
};

async function fn() {
  const a = await 9;
  const b = await delayAndGetRandom(1000);
  const c = await 5;
  await delayAndGetRandom(1000);
  
  return a + b * c;
}

// Π’Ρ‹Π·ΠΎΠ² fn
fn().then(console.log);

Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ fn функция?

  1. ПослС Π²Ρ‹Π·ΠΎΠ²Π° fn Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ пСрвая строка конвСртируСтся ΠΈΠ· const a = await 9; Π² const a = await Promise.resolve(9);.

  2. ПослС использования await, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ приостанавливаСтся, ΠΏΠΎΠΊΠ° a Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ своё Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС это 9).

  3. delayAndGetRandom(1000) приостанавливаСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ fn Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ сама (послС 1 сСкунды). Π­Ρ‚ΠΎ, фактичСски, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ остановкой fn Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° 1 сСкунду.

  4. Π’Π°ΠΊΠΆΠ΅ delayAndGetRandom(1000) Ρ‡Π΅Ρ€Π΅Π· resolve Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ случайноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ присваиваСтся ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ b.

  5. Π‘Π»ΡƒΡ‡Π°ΠΉ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ c ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ ΡΠ»ΡƒΡ‡Π°ΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ a. ПослС этого ΠΎΠΏΡΡ‚ΡŒ происходит ΠΏΠ°ΡƒΠ·Π° Π½Π° 1 сСкунду, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ delayAndGetRandom(1000) Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚, Ρ‚. ΠΊ. этого Π½Π΅ трСбуСтся.

  6. Под ΠΊΠΎΠ½Π΅Ρ† эти значСния ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Ρ„ΠΎΡ€ΠΌΡƒΠ»Π΅ a + b * c. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ обёртываСтся Π² промис с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Promise.resolve ΠΈ возвращаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2

function resolveAfter2Seconds(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

async function add1(x) {
  const a = await resolveAfter2Seconds(20);
  const b = await resolveAfter2Seconds(30);
  return x + a + b;
}

add1(10).then(v => {
  console.log(v);  // prints 60 after 4 seconds.
});

async function add2(x) {
  const a = resolveAfter2Seconds(20);
  const b = resolveAfter2Seconds(30);
  return x + await a + await b;
}

add2(10).then(v => {
  console.log(v);  // prints 60 after 2 seconds.
});

НС ΠΏΡƒΡ‚Π°ΠΉΡ‚Π΅ await ΠΈ Promise.all

Ѐункция add1 приостанавливаСтся Π½Π° 2 сСкунды для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ await ΠΈ Π΅Ρ‰Π΅ Π½Π° 2 для Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ‚Π°ΠΉΠΌΠ΅Ρ€ создаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС срабатывания ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ add2 ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΎΠ±Π° ΠΈ ΠΎΠ±Π° ΠΆΠ΅ пСрСходят Π² состояниС await. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ функция add2 Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ скорСС Ρ‡Π΅Ρ€Π΅Π· Π΄Π²Π΅, Ρ‡Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ сСкунды, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Однако Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ всС ΠΆΠ΅ Π½Π΅ ΠΏΠ°Ρ€Π°Π»Π΅Π»Π»ΡŒΠ½ΠΎ, Π° Π΄Ρ€ΡƒΠ³ Π·Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ - такая конструкция Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ автоматичСского использования Promise.all. Если Π΄Π²Π° ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Promise Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ, слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Promise.all.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3 (с выбрасываниСм ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ)

Когда функция async выбрасываСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

async function throwsValue() {
    throw new Error('oops');
}
throwsValue()
    .then((resolve) => {
            console.log("resolve:" + resolve);
        },
        (reject) => {
            console.log("reject:" + reject);
        });
//prints "reject:Error: oops"
//or
throwsValue()
    .then((resolve) => {
        console.log("resolve:" + resolve);
    })
    .catch((reject) => {
        console.log("reject:" + reject);
    });
//prints "reject:Error: oops"

AJAX

это Асинхронный JavaScript ΠΈ XML. Π­Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Π΅Π±-прилоТСниям Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ асинхронно β€” ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ запросы ΠΊ сСрвСру Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Под AJAX понимаСтся Π½Π΅ ΠΎΠ΄Π½Π° тСхнология, ΠΈ ΠΎΠ½Π° Π½Π΅ являСтся Π½ΠΎΠ²ΠΎΠΉ. На самом Π΄Π΅Π»Π΅ это Π³Ρ€ΡƒΠΏΠΏΠ° Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ (HTML, CSS, Javascript, XML, ΠΈ Ρ‚.Π΄.), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ вмСстС для создания соврСмСнных Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

AJAX запрос, - это комплСкс выполняСмых Π·Π°Π΄Π°Ρ‡, Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ «запрос-ΠΎΡ‚Π²Π΅Ρ‚Β».

Π’ основС Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π»Π΅ΠΆΠΈΡ‚ использованиС нСстандартного ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° XMLHttpRequest, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ для взаимодСйствия со скриптами Π½Π° сторонС сСрвСра. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ, Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ… Π²ΠΊΠ»ΡŽΡ‡Π°Ρ XML, HTML ΠΈ Π΄Π°ΠΆΠ΅ тСкстовыС Ρ„Π°ΠΉΠ»Ρ‹. Π‘Π°ΠΌΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π² Ajax β€” это Π΅Π³ΠΎ асинхронный ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этой Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ взаимодСйствиС с сСрвСром Π±Π΅Π· нСобходимости ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ страницы. Π­Ρ‚ΠΎ позволяСт ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ содСрТимоС страницы частично, Π² зависимости ΠΎΡ‚ дСйствий ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

XMLHttpRequest – это встроСнный Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ HTTP-запросы ΠΊ сСрвСру Π±Π΅Π· ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ страницы. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Π½Π°Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°Ρ… HTTP ΠΈ HTTPS.

НСсмотря Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ слова Β«XMLΒ» Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ, XMLHttpRequest ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π»ΡŽΠ±Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с XML. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ/ΡΠΊΠ°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ прогрСсс ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

На сСгодняшний дСнь Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ XMLHttpRequest, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сущСствуСт Π΄Ρ€ΡƒΠ³ΠΎΠΉ, Π±ΠΎΠ»Π΅Π΅ соврСмСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ fetch.

Π’ соврСмСнной Π²Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ XMLHttpRequest ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎ Ρ‚Ρ€Ρ‘ΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ:

  1. По историчСским ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ: сущСствуСт ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ XMLHttpRequest, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ.

  2. ΠΠ΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ старыС Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρ‹ ΠΈ Π½Π΅ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ„ΠΈΠ»Ρ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ количСство ΠΊΠΎΠ΄Π°).

  3. ΠŸΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ fetch ΠΏΠΎΠΊΠ° Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, отслСТиваниС прогрСсса ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π½Π° сСрвСр.

XMLHttpRequest ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π²Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹: синхронный ΠΈ асинхронный.

Рассмотрим асинхронный, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ запрос, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈ шага:

  1. Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ XMLHttpRequest.

    let xhr = new XMLHttpRequest(); // Ρƒ конструктора Π½Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

    xhr – это пСрСмСнная ΠΈΠ»ΠΈ константа Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ хранится, - экзСмпляр класса XMLHttpRequest, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

  2. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ.

    xhr.open(method, URL, [async, user, password])

    Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ вызываСтся сразу послС new XMLHttpRequest. Π’ Π½Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ основныС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ запроса:

    • method – HTTP-ΠΌΠ΅Ρ‚ΠΎΠ΄. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это "GET" ΠΈΠ»ΠΈ "POST".

    • URL – URL, ΠΊΡƒΠ΄Π° отправляСтся запрос: строка, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ URL.

    • async – Ссли ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ false, Ρ‚ΠΎΠ³Π΄Π° запрос Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ синхронно, это ΠΌΡ‹ рассмотрим Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

    • user, password – Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ для Π±Π°Π·ΠΎΠ²ΠΎΠΉ HTTP-Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ (Ссли трСбуСтся).

    Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² open, Π²ΠΎΠΏΡ€Π΅ΠΊΠΈ своСму названию, Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ соСдинСниС. Он лишь ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ запрос, Π½ΠΎ нСпосрСдствСнно отсылаСтся запрос Ρ‚ΠΎΠ»ΡŒΠΊΠΎ лишь послС Π²Ρ‹Π·ΠΎΠ²Π° send.

  3. ΠŸΠΎΡΠ»Π°Ρ‚ΡŒ запрос.

    xhr.send([body])

    Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ устанавливаСт соСдинСниС ΠΈ отсылаСт запрос ΠΊ сСрвСру. ΠΠ΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ body содСрТит Ρ‚Π΅Π»ΠΎ запроса.

  4. Π‘Π»ΡƒΡˆΠ°Ρ‚ΡŒ события Π½Π° xhr, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚.

    Π’Ρ€ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… события:

    • load – происходит, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΎΡ‚Π²Π΅Ρ‚, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ с HTTP-ошибкой, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 404.

    • error – ΠΊΠΎΠ³Π΄Π° запрос Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅Ρ‚ соСдинСния ΠΈΠ»ΠΈ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΉ URL.

    • progress – происходит пСриодичСски Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π°, сообщаСт ΠΎ прогрСссС.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Код Π½ΠΈΠΆΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ /article/xmlhttprequest/example/load с сСрвСра ΠΈ сообщаСт ΠΎ прогрСссС:

// 1. Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ XMLHttpRequest-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
let xhr = new XMLHttpRequest();

// 2. НастраиваСм Π΅Π³ΠΎ: GET-запрос ΠΏΠΎ URL /article/.../load
xhr.open('GET', '/article/xmlhttprequest/example/load');

// 3. ΠžΡ‚ΡΡ‹Π»Π°Π΅ΠΌ запрос
xhr.send();

// 4. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ сработаСт послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡ‚Π²Π΅Ρ‚ сСрвСра
xhr.onload = function() {
  if (xhr.status != 200) { // Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ HTTP-статус ΠΎΡ‚Π²Π΅Ρ‚Π°, Ссли статус Π½Π΅ 200, Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка
    alert(`Ошибка ${xhr.status}: ${xhr.statusText}`); // НапримСр, 404: Not Found
  } else { // Ссли всё ΠΏΡ€ΠΎΡˆΠ»ΠΎ Π³Π»Π°Π΄ΠΊΠΎ, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚
    alert(`Π“ΠΎΡ‚ΠΎΠ²ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ${xhr.response.length} Π±Π°ΠΉΡ‚`); // response -- это ΠΎΡ‚Π²Π΅Ρ‚ сСрвСра
  }
};

xhr.onprogress = function(event) {
  if (event.lengthComputable) {
    alert(`ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ${event.loaded} ΠΈΠ· ${event.total} Π±Π°ΠΉΡ‚`);
  } else {
    alert(`ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ${event.loaded} Π±Π°ΠΉΡ‚`); // Ссли Π² ΠΎΡ‚Π²Π΅Ρ‚Π΅ Π½Π΅Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Content-Length
  }

};

xhr.onerror = function() {
  alert("Запрос Π½Π΅ удался");
};

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ сСрвСра Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ запроса Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… свойствах xhr:status Код состояния HTTP (число): 200, 404, 403 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ 0 Π² случаС, Ссли ошибка Π½Π΅ связана с HTTP.

statusText Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎ состоянии ΠΎΡ‚Π²Π΅Ρ‚Π° HTTP (строка): ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ OK для 200, Not Found для 404, Forbidden для 403, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

response (Π² старом ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ responseText)Π’Π΅Π»ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° сСрвСра, Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ΄ΡƒΡ‚ ΠΎΡ‚ сСрвСра Π² Π²ΠΈΠ΄Π΅ строки

Π’ΠΈΠΏ ΠΎΡ‚Π²Π΅Ρ‚Π°:

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свойство xhr.responseType, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ‚ΠΈΠΏ ΠΎΡ‚Π²Π΅Ρ‚Π°:

  • "" (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) – строка,

  • "text" – строка,

  • "arraybuffer" – ArrayBuffer (для Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, смотритС Π² ArrayBuffer, Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ массивы),

  • "blob" – Blob (для Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, смотритС Π² Blob),

  • "document" – XML-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ (ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ XPath ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ XML-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹),

  • "json" – JSON (парсится автоматичСски).

К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΎΡ‚Π²Π΅Ρ‚ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON:

let xhr = new XMLHttpRequest();

xhr.open('GET', '/article/xmlhttprequest/example/json');

xhr.responseType = 'json';

xhr.send();

// Ρ‚Π΅Π»ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° {"сообщСниС": "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!"}
xhr.onload = function() {
  let responseObj = xhr.response;
  alert(responseObj.message); // ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!
};

Бостояния запроса:

Π£ XMLHttpRequest Π΅ΡΡ‚ΡŒ состояния(статусы HTTP-запроса), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ выполнСния запроса. Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² свойствС xhr.readyState.

Бписок всСх состояний, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π² спСцификации:

UNSENT = 0; // исходноС состояниС
OPENED = 1; // Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ open
HEADERS_RECEIVED = 2; // ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π°
LOADING = 3; // ΠΎΡ‚Π²Π΅Ρ‚ Π² процСссС ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ (Π΄Π°Π½Π½Ρ‹Π΅ частично ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹)
DONE = 4; // запрос Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½

Бостояния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° XMLHttpRequest ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² Ρ‚Π°ΠΊΠΎΠΌ порядкС: 0 β†’ 1 β†’ 2 β†’ 3 β†’ … β†’ 3 β†’ 4. БостояниС 3 повторяСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ….

onreadystatechange – это событиС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ случится ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ ΠΎΡ‚ сСрвСра.

ИзмСнСния Π² состоянии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° запроса Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ событиС readystatechange:

xhr.onreadystatechange = function() {
  if (xhr.readyState == 3) {
    // Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°
  }
  if (xhr.readyState == 4) {
    // запрос Π·Π°Π²Π΅Ρ€ΡˆΡ‘Π½
  }
};

COMET

COMET – ΠΎΠ±Ρ‰ΠΈΠΉ Ρ‚Π΅Ρ€ΠΌΠΈΠ½, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ получСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π΅ сСрвСра.

МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ AJAX – это Β«ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» запрос – ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Β», Π° COMET – это Β«Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π», ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ приходят Π΄Π°Π½Π½Ρ‹Π΅Β».

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ COMET-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ:

  • Π§Π°Ρ‚ – Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ сидит ΠΈ смотрит, Ρ‡Ρ‚ΠΎ ΠΏΠΈΡˆΡƒΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. ΠŸΡ€ΠΈ этом Π½ΠΎΠ²Ρ‹Π΅ сообщСния приходят «сами ΠΏΠΎ сСбС», ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ для обновлСния ΠΎΠΊΠ½Π° Ρ‡Π°Ρ‚Π°.

  • Аукцион – Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ смотрит Π½Π° экран ΠΈ Π²ΠΈΠ΄ΠΈΡ‚, ΠΊΠ°ΠΊ обновляСтся тСкущая ставка Π·Π° Ρ‚ΠΎΠ²Π°Ρ€.

  • Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ рСдактирования – ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ видят ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± этом. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈ совмСстноС Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρ‹ видят измСнСния Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°.

COMET-Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° страницС Π±Π΅Π· участия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

На Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ тСхнология COMET ΡƒΠ΄ΠΎΠ±Π½ΠΎ рСализуСтся Π²ΠΎ всСх Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ….

Fetch

Fetch - это ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½Ρ‹ΠΉ XMLHttpRequest, позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ запросы, схоТиС с XMLHttpRequest (XHR). ОсновноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Fetch API ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Promises (ΠžΠ±Π΅Ρ‰Π°Π½ΠΈΡ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ простоС ΠΈ чистоС API, ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ катастрофичСского количСства callback'ΠΎΠ².

Бинтаксис ΠΌΠ΅Ρ‚ΠΎΠ΄Π° fetch:

let promise = fetch(url, [options]) 
  • url – URL, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ запрос,

  • options – Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с настройками запроса.

Π‘Π΅Π· options это простой GET-запрос, ΡΠΊΠ°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ содСрТимоС ΠΏΠΎ адрСсу url.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ fetch Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ПРОМИБ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΎΡ‚Π²Π΅Ρ‚, выполняСт коллбэки с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ Response ΠΈΠ»ΠΈ с ошибкой, Ссли запрос Π½Π΅ удался.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ получСния ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ происходит Π² Π΄Π²Π° этапа.

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, promise выполняСтся с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ встроСнного класса Response Π² качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сСрвСр ΠΏΡ€ΠΈΡˆΠ»Ρ‘Ρ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π°.

На этом этапС ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ статус HTTP-запроса ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, выполнился Π»ΠΈ ΠΎΠ½ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, Π½ΠΎ ΠΏΠΎΠΊΠ° Π±Π΅Π· Ρ‚Π΅Π»Π° ΠΎΡ‚Π²Π΅Ρ‚Π°.

ΠŸΡ€ΠΎΠΌΠΈΡ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с ошибкой, Ссли fetch Π½Π΅ смог Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ HTTP-запрос, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ ошибкС сСти ΠΈΠ»ΠΈ Ссли Π½Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ сайта. HTTP-статусы 404 ΠΈ 500 Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ошибкой.

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ HTTP-статус Π² свойствах ΠΎΡ‚Π²Π΅Ρ‚Π°:

  • status – ΠΊΠΎΠ΄ статуса HTTP-запроса, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 200.

  • ok – логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: Π±ΡƒΠ΄Π΅Ρ‚ true, Ссли ΠΊΠΎΠ΄ HTTP-статуса Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 200-299.

НапримСр:

let response = await fetch(url);

if (response.ok) { // Ссли HTTP-статус Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 200-299
  // ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ‚Π΅Π»ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° (см. ΠΏΡ€ΠΎ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½ΠΈΠΆΠ΅)
  let json = await response.json();
} else {
  alert("Ошибка HTTP: " + response.status);
}

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, для получСния Ρ‚Π΅Π»Π° ΠΎΡ‚Π²Π΅Ρ‚Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

Response прСдоставляСт нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², основанных Π½Π° промисах, для доступа ΠΊ Ρ‚Π΅Π»Ρƒ ΠΎΡ‚Π²Π΅Ρ‚Π° Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°Ρ…:

  • response.text() – Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст,

  • response.json() – Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON,

  • response.formData() – Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ FormData (Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ Π΅Π³ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅),

  • response.blob() – Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΊΠ°ΠΊ Blob (Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ с Ρ‚ΠΈΠΏΠΎΠΌ),

  • response.arrayBuffer() – Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚ ΠΊΠ°ΠΊ ArrayBuffer (Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ прСдставлСниС Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…),

  • ΠΏΠΎΠΌΠΈΠΌΠΎ этого, response.body – это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ReadableStream, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚Π΅Π»ΠΎ запроса ΠΏΠΎ частям.

НапримСр, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ JSON-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с послСдними ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ ΠΈΠ· рСпозитория Π½Π° GitHub:

let url = 'https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits';
let response = await fetch(url);

let commits = await response.json(); // Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΎΡ‚Π²Π΅Ρ‚ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON

alert(commits[0].author.login);

Π’ΠΎ ΠΆΠ΅ самоС Π±Π΅Π· await, с использованиСм промисов:

fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits')
  .then(response => response.json())
  .then(commits => alert(commits[0].author.login));

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π±Π΅Π· await:

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ response ΠΊΡ€ΠΎΠΌΠ΅ доступа ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ headers, статусу status ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ полям ΠΎΡ‚Π²Π΅Ρ‚Π°, Π΄Π°Ρ‘Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ‚Π΅Π»ΠΎ, Π² ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ описано Π²Ρ‹ΡˆΠ΅.

Π˜Ρ‚ΠΎΠ³ΠΎ: Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ запрос с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ fetch состоит ΠΈΠ· Π΄Π²ΡƒΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² await:

let response = await fetch(url, options); // Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π°
let result = await response.json(); // Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π΅Π»ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON

Или, бСз await:

fetch(url, options)
  .then(response => response.json())
  .then(result => /* ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ */)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚Π°:

  • response.status – HTTP-ΠΊΠΎΠ΄ ΠΎΡ‚Π²Π΅Ρ‚Π°,

  • response.ok – true, Ссли статус ΠΎΡ‚Π²Π΅Ρ‚Π° Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ 200-299.

  • response.headers – ΠΏΠΎΡ…ΠΎΠΆΠΈΠΉ Π½Π° Map ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с HTTP-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ.

Framework vs library

Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ - это Π½Π°Π±ΠΎΡ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ инструмСнтов. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° - это просто ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ языкС.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° - это сборка Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пСрСнСсСна ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΡ‚ΠΎΠΌ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… прилоТСниях. Основная идСя Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ пСрСносимы ΠΌΠ΅ΠΆΠ΄Ρƒ прилоТСниями ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ - это каркас для Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ прилоТСния, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ собраны всС основныС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ: Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, структура, Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ Ρ‚.Π΄. МоТно ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, это минимальная Π·Π°Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°, Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π’Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π΄ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» ΠΈ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ дальшС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’Π°ΡˆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π·Π° счСт Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΈ Π·Π°Π±ΠΎΡ‚Π»ΠΈΠ²ΠΎ для Вас Π·Π°Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ΠΎ.

Π€Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ β€” Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²Π°ΠΌΠΈ, Π° Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, ваш ΠΊΠΎΠ΄ вызываСтся ΠΈΠ· Π½Π΅Π³ΠΎ.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° β€” это Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊ использованию Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π΅ΠΆΠΈΡ‚ Π² контСкстС прилоТСния, ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ выполняСт свою Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° становится ΠΏΡ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Ρ‡Π°ΡΡ‚ΡŒΡŽ прилоТСния.

API - это интСрфСйс взаимодСйствия с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΈΠ·Π²Π½Π΅. Π£ Вас Π΅ΡΡ‚ΡŒ сам ΠΏΠΎ сСбС ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ ΠΈ ΠΎΠ½ прСдставляСтся Ρ‡Π΅Ρ€Π½Ρ‹ΠΌ ящиком ΠΈ Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΈΠΌ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Ρ‹ опрСдСляСтС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ взаимодСйствия с Π½ΠΈΠΌ ΠΈ описываСтС ΠΈΡ…, Π° сторонниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ. Π­Ρ‚ΠΎ самый простой Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ для прилоТСния ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΊΠΎΠ΄Ρƒ Π²Π½Π΅ этого прилоТСния. Π­Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ внСшнюю для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ.

  1. Linked list

Big O

ES2015

CoreHTML

CoreCSS (flexbox, positioning)

CoreJS

Design patterns

Architectural Patterns []

FE optimization / Performance

DOM/BOM

Agile/SCRUM

tasks

reduce, filter, map, forEach, DOM traversing

Last updated

Was this helpful?