You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/11-async/01-callbacks/article.md
+26-28
Original file line number
Diff line number
Diff line change
@@ -1,20 +1,18 @@
1
-
2
-
3
-
# Įvadas: *callbacks*
1
+
# Įvadas: callbacks
4
2
5
3
```warn header="We use browser methods here"
6
-
*Callbackų*, *promise'ų* ir kitų abstrakčių koncepcijų veikimo demonstacijai, bus naudojami naršyklės metodai. Pagrinde bus atliekamos paprastos dokumentų manipuliacijos pasitelkiant skriptus.
4
+
*Callback'ų*, *promise'ų* ir kitų abstrakčių koncepcijų veikimo demonstacijai, bus naudojami naršyklės metodai. Pagrinde bus atliekamos paprastos dokumentų manipuliacijos pasitelkiant skriptus.
7
5
8
6
Jeigu šie metodai Jums dar nepažįstami, jų naudojimas pavyzdžiuose trikdo ar tiesiog norėtumėte juos suprasti geriau, pamėginkite paskaityti kelis skyrius iš kitos šių pratybų [dalies](/document).
9
7
```
10
8
11
-
Daugelis veiksmų JavaScripte yra *asinchroniški* (*asynchronous*). Kitaip tariant, mes juos inicijuojame dabar, bet jie įvykdomi vėliau.
9
+
Daugelis veiksmų JavaScript'e yra *asinchroniški* (*asynchronous*). Kitaip tariant, mes juos inicijuojame dabar, bet jie įvykdomi vėliau.
12
10
13
11
Tokį veiksmą ateičiai mes galime suplanuoti naudodami `setTimeout` metodą.
14
12
15
13
Egzistuoja ir kiti asinchroninių veiksmų pavyzdžiai, tarkime, skriptų ir modulių (*modules*) užkrovimas (juos aptarsime vėlesniuose skyriuose).
16
14
17
-
Pažvelkite į `loadScript(src)` funkciją, kurį užkrauna skriptą su pateiktu `src`.
15
+
Pažvelkite į `loadScript(src)` funkciją, kurį užkrauna skriptą su pateiktu `src`:
18
16
19
17
```js
20
18
functionloadScript(src) {
@@ -107,11 +105,11 @@ Tai vadinama *callback'ais* grįstu (*callback-based*) asinchroniniu programavim
107
105
108
106
Mes panašiai paderėme pavyzdynėje `loadScript` funkcijoje.
109
107
110
-
## *Callback* funkcija *callback* funkcijoje
108
+
## Callback funkcija callback funkcijoje
111
109
112
110
O kaip paleisti du skriptus paeiliui? Pirmą, o po jo – antrą.
113
111
114
-
Naturalus sprendimas būtų įdėti antrąjį `loadScript`išvietimą *callbacke*, štai taip:
112
+
Naturalus sprendimas būtų įdėti antrąjį `loadScript`iškvietimą *callback'e*, štai taip:
Taigi, kekviena nauja operacija yra *callbacko* viduje. Tai priimtina nedideliam kiekiui operacijų. Kitus šios problemos spredimo būdus aptarsime netrukus.
148
+
Taigi, kekviena nauja operacija yra *callback'o* viduje. Tai priimtina nedideliam kiekiui operacijų. Kitus šios problemos spredimo būdus aptarsime netrukus.
151
149
152
-
## Tikdžių valdymas
150
+
## Klaidų valdymas
153
151
154
-
Ankstesniuose pavyzdžiuose mes visiškai nekalbėjome apie tikdžius (*errors*). Kas, jei skripto krovimasis nepavyksta? Tokiu atveju mūsų *callbackas* turėtų sugebėti į tai reaguoti.
152
+
Ankstesniuose pavyzdžiuose mes visiškai nekalbėjome apie klaidas (*errors*). Kas, jei skripto krovimasis nepavyksta? Tokiu atveju mūsų *callback'as* turėtų sugebėti į tai reaguoti.
155
153
156
-
Štai patobulinta `loadScript` versija, kuri suseka krovimosi trikdžius.
154
+
Štai patobulinta `loadScript` versija, kuri suseka krovimosi klaidas.
Būdas, kuriuo mes pasinaudojome paleisti `loadScript`, yra gan dažnas. Jis pirmenybę teikia trikdžių valdymui *callbackais* ("error-first callback style").
183
+
Būdas, kuriuo mes pasinaudojome paleisti `loadScript`, yra gan dažnas. Jis pirmenybę teikia klaidų valdymui *callback'ais* ("error-first callback style").
186
184
187
185
Šio stiliaus konvencija teigia:
188
-
1. Pirmasis *callbacko* argumentas yra rezervuotas trikdžiui, jei jis pasitaikys. Čia kviečiama `callback(err)` funkcija.
186
+
1. Pirmasis *callback'o* argumentas yra rezervuotas klaidai, jei jį pasitaikys. Čia kviečiama `callback(err)` funkcija.
189
187
2. Antrasis argumentas (ir tolimesni, jei jie reikalingi) yra skirtas sėkmingam rezultatui. Tuomet kviečiama `callback(null, result1, result2…)` funkcija.
190
188
191
-
Taigi, viena `callback` funkcija yra tinkama ir informavimui apie trikdžius ir rezultatų grąžinimui.
189
+
Taigi, viena `callback` funkcija yra tinkama ir informavimui apie klaidas ir rezultatų grąžinimui.
192
190
193
-
## „Pražūties piraminė“ (Pyramid of Doom)
191
+
## „Pražūties piramidė“ (Pyramid of Doom)
194
192
195
-
Iš pirmo žvilgstio – tai geras būdas asinchroniniam kodavimui. Vienam ar dviem sugrupuotiems funkcijų išvietimams jis tikrai tinka.
193
+
Iš pirmo žvilgstio – tai geras būdas asinchroniniam kodavimui. Vienam ar dviem sugrupuotiems funkcijų iškvietimams jis tikrai tinka.
196
194
197
195
Bet didesniam kiekiui viena kitą sekančių asinchroninių operacijų mes turėsime štai tokį kodą:
1. Mes krauname `1.js`, tuomet, jei nėra trikdžių.
229
-
2. Mes krauname `2.js`, tuomet, jei nėra trikdžių.
230
-
3. Mes krauname `3.js`, tuomet, jei nėra trikdžių – darome kažką kito `(*)`.
226
+
1. Mes krauname `1.js`, tuomet, jei nėra klaidų.
227
+
2. Mes krauname `2.js`, tuomet, jei nėra klaidų.
228
+
3. Mes krauname `3.js`, tuomet, jei nėra klaidų – darome kažką kito `(*)`.
231
229
232
-
Visi funkcijų išvietimai tampa vis labiau sugrupuoti, kodas gilėja ir tampa sunkiai suvaldomu. Ypač, jei vietoj daugtaškių `...` turime tikrą kodą, su ciklais (*loops*), sąlyginėmis išraiškomis (*conditional statements*) ir t.t.
230
+
Visi funkcijų iškvietimai tampa vis labiau sugrupuoti, kodas gilėja ir tampa sunkiai suvaldomu. Ypač, jei vietoj daugtaškių `...` turime tikrą kodą, su ciklais (*loops*), sąlyginėmis išraiškomis (*conditional statements*) ir t.t.
233
231
234
-
Tai kartais vadinama „*callbackų* pragaru“ arba „pražūties piramide“.
232
+
Tai kartais vadinama „*callback'ų* pragaru“ arba „pražūties piramide“.
Sugrupuotų funkcijų išvietimų piramidė auga su kiekviena asinchronine operacija ir greitai tampa nekontroliuojama.
260
+
Sugrupuotų funkcijų iškvietimų piramidė auga su kiekviena asinchronine operacija ir greitai tampa nekontroliuojama.
263
261
264
262
Todėl toks kodo rašymo būdas nėra labai geras.
265
263
@@ -290,17 +288,17 @@ function step3(error, script) {
290
288
if (error) {
291
289
handleError(error);
292
290
} else {
293
-
// ...continue after all scripts are loaded (*)
291
+
// ...tęsti užsikrovus visiems skriptams (*)
294
292
}
295
293
};
296
294
```
297
295
298
-
Matote? Ji daro tą patį, bet šiuo atveju nebeligo komplikuoto operacijų grupavimo, nes kiekvieną veiksmą mes pavertėme atskira *top-level* funkcija.
296
+
Matote? Ji daro tą patį, bet šiuo atveju nebeliko komplikuoto operacijų grupavimo, nes kiekvieną veiksmą mes pavertėme atskira *top-level* funkcija.
299
297
300
298
Viskas veikia, tačiau kodas atrodo prastai. Jis sunkiai skaitomas, o skaitytojas turi šokinėti nuo vienos kodo dalies prie kitos. Tai nepatogu, ypač jei skaitantysis nėra susipažinęs su šiuo kodu ir tiksliai nežino, kur ieškoti reikiamos kodo dalies.
301
299
302
300
Taipogi, funkcijos pavadinimu `step*` yra vienkartinės ir sukurtus tik „pražūties piramidei“ išvengti. Jos nebebus panaudoto šios kodo grandinės išorėje, tad susiduriame su vardų srities (*namespace*) teršimu.
303
301
304
302
Mums reikėtų kažko geresnio.
305
303
306
-
Laimei, yra kitų būtų išvengti minėtų „piramidžių“. Geriausias būdas yra naudoti „pažadus“, aptariamus kitame skyriuje.
304
+
Laimei, yra kitų būdų išvengti minėtų „piramidžių“. Geriausias būdas yra naudoti „pažadus“ (*promises*), aptariamus kitame skyriuje.
0 commit comments