Разумевање синхроног и асинкроног у ЈаваСцрипту - Део 2
У првом делу овог поста, видели смо како концепти синхроног и асинхроног се перципирају ин ЈаваСцрипт. У овом другом делу, господин Кс се поново појављује да нам помогне да разумемо како сетТимеоут и АЈАКС АПИ-ји рад.
Чудан захтев
Вратимо се назад на причу о господину Кс и филму за који желите да одете. Рецимо да оставите задатак за г пет сати после добио је твоју поруку.
Он није срећан због тога, запамтите, он не узима нову поруку док не заврши са тренутном, и ако он узме вашу, он мора чекати пет хоурс чак и започети задатак. Дакле, да не будете трошили време, он доноси помоћника, Мр Х.
Уместо да чека, пита га господина Х оставите нову поруку за задатак у реду након одређеног времена, и прелази на следећу поруку.
Прошло је пет сати; Мр Х ажурира ред са новом поруком. Након што је завршио са обрадом свих прикупљених порука пре господина Х, г. Кс извршава ваш захтевани задатак. Дакле, на овај начин, можете оставити захтев касније, и не чекати док се не испуни.
Али зашто господин Х оставља поруку у реду уместо да директно контактира господина Кс? Јер као што сам споменуо у првом делу, само Кс остављајући му поруку путем телефонског позива - нема изузетака.
1. Тхе сетТимеоут ()
метода
Претпоставимо да имате сет кода који желите извршити након одређеног времена. Да би то урадио, ви само замотајте га у функцију, и додајте га у а сетТимеоут ()
метода заједно са временом кашњења. Синтакса сетТимеоут ()
је као што следи:
сетТимеоут (функција, вријеме кашњења, арг…)
Тхе арг…
параметар означава било који аргумент који функција узима, и кашњење
се додаје у милисекундама. Испод можете видјети једноставан примјер кода који излази “хеј” након 3 секунде.
сетТимеоут (функција () цонсоле.лог ('хеј'), 3000);
Једном сетТимеоут ()
почиње да тече, уместо да блокира стог позива док се назначено време одлагања не заврши, а Тајмер се активира, и стог позива се постепено празни за следећу поруку (слично као и преписка између г. Кс и г. Х).
Када тајмер истекне, нова порука придружује се реду, и петља догађаја покупи је када је стацк позива слободан након обраде свих порука пред њим - тако се код изводи асинкроно.
2. АЈАКС
АЈАКС (Асинкрони ЈаваСцрипт и КСМЛ) је концепт који користи КСМЛХттпРекуест
(КСХР) АПИ за правите захтеве за сервер и обрадите одговоре.
Када претраживачи направе серверске захтеве без употребе КСМЛХттпРекуест, паге рефресхес и поново учитава свој кориснички интерфејс. Када се обрада захтева и одговора обрађује помоћу КСХР АПИ-ја, и УИ остаје непромењен.
Дакле, у основи је циљ правите захтеве без поновног учитавања страница. Сада, где је “асинхроно” у ово? Само коришћење КСХР кода (који ћемо видети за тренутак) не значи да је АЈАКС, јер КСХР АПИ може раде и синхроно и асинхроно.
КСХР подразумевано је подешен на раде асинхроно; када функција направи захтев користећи КСХР, он враћа се без чекања на одговор.
Ако је КСХР конфигурисан бе синцхроноус, тада функција чека док се одговор је примљен и обрађен пре повратка.
Пример кода 1
Овај пример представља КСМЛХттпРекуест
стварање објекта. Тхе отвори ()
метода, потврђује УРЛ адресу захтева и пошаљи ()
метод шаље захтев.
вар кхр = ново КСМЛХттпРекуест (); кхр.опен ("ГЕТ", урл); кхр.сенд ();
Сваки директан приступ подацима о одговору после пошаљи ()
ће бити узалуд, јер пошаљи ()
не чека док се захтев не заврши. Запамтите, КСМЛХТТПРекуест је постављен да ради асинхроно по дефаулту.
Шифра Пример 2
Тхе хелло.ткт
фајл у овом примеру је једноставан текстуални фајл који садржи текст 'хелло'. Тхе одговор
својство КСХР-а је неважеће, јер није исписао текст "хелло".
вар кхр = ново КСМЛХттпРекуест (); кхр.опен ("ГЕТ", "хелло.ткт"); кхр.сенд (); доцумент.врите (кхр.респонсе); // празан низ
КСХР имплементира микро-рутину стално проверава одговор у свакој милисекунди, и активира бесплатне догађаје за различите државе пролази захтев. Када се одговор учита, догађај учитавања покреће КСХР, који могу дати валидан одговор.
вар кхр = ново КСМЛХттпРекуест (); кхр.опен ("ГЕТ", "хелло.ткт"); кхр.сенд (); кхр.онлоад = фунцтион () доцумент.врите (тхис.респонсе) // пише 'хелло' у документ
Одговор унутар догађаја оптерећења излази "здраво", исправан текст.
Пожељан је асинхрони начин, јер не блокира друге скрипте док се захтјев не доврши.
Ако се одговор мора обрадити синхроно, пролазимо фалсе
као последњи аргумент опен
, која означава КСХР АПИ говорећи то мора бити синхроно (подразумевано последњи аргумент од опен
је истина
, које није потребно изричито навести).
вар кхр = ново КСМЛХттпРекуест (); кхр.опен ("ГЕТ", "хелло.ткт", фалсе); кхр.сенд (); доцумент.врите (кхр.респонсе); // пише 'хелло' у документ
Зашто све ово учити?
Готово сви почетници праве неке грешке са асинкроним концептима као што су сетТимеоут ()
и АЈАКС, на пример претпостављајући сетТимеоут ()
извршава код након времена кашњења, или обрадом одговора директно унутар функције која прави АЈАКС захтјев.
Ако знате како се слагалица уклапа, можете избегавајте такву конфузију. Знате да је време одлагања сетТимеоут ()
не означава време када се покреће извршавање кода, али време када тајмер истекне и нова порука се ставља у ред чекања, која ће бити обрађена само када је стацк позива слободан.