Skip to content

Commit df96bf8

Browse files
authored
Merge pull request #19 from kkuciauskas/master
Translate "Introduction: callbacks" to Lithuanian
2 parents 49b7016 + 6c3bfcb commit df96bf8

File tree

1 file changed

+65
-65
lines changed

1 file changed

+65
-65
lines changed

1-js/11-async/01-callbacks/article.md

+65-65
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11

22

3-
# Introduction: callbacks
3+
# Įvadas: *callbacks*
44

55
```warn header="We use browser methods here"
6-
To demonstrate the use of callbacks, promises and other abstract concepts, we'll be using some browser methods; specifically, loading scripts and performing simple document manipulations.
6+
*Callbackų*, *promise'ų* ir kitų abstrakčių koncepcijų veikimo demonstacijai, bus naudojami naršyklės metodai. Pagrinde bus atliekamos paprastos dokumentų manipuliacijos pasitelkiant skriptus.
77
8-
If you're not familiar with these methods, and their usage in the examples is confusing, or if you would just like to understand them better, you may want to read a few chapters from the [next part](/document) of the tutorial.
8+
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).
99
```
1010

11-
Many actions in JavaScript are *asynchronous*. In other words, we initiate them now, but they finish later.
11+
Daugelis veiksmų JavaScripte yra *asinchroniški* (*asynchronous*). Kitaip tariant, mes juos inicijuojame dabar, bet jie įvykdomi vėliau.
1212

13-
For instance, we can schedule such actions using `setTimeout`.
13+
Tokį veiksmą ateičiai mes galime suplanuoti naudodami `setTimeout` metodą.
1414

15-
There are other real-world examples of asynchronous actions, e.g. loading scripts and modules (we'll cover them in later chapters).
15+
Egzistuoja ir kiti asinchroninių veiksmų pavyzdžiai, tarkime, skriptų ir modulių (*modules*) užkrovimas (juos aptarsime vėlesniuose skyriuose).
1616

17-
Take a look at the function `loadScript(src)`, that loads a script with the given `src`:
17+
Pažvelkite į `loadScript(src)` funkciją, kurį užkrauna skriptą su pateiktu `src`.
1818

1919
```js
2020
function loadScript(src) {
@@ -24,41 +24,41 @@ function loadScript(src) {
2424
}
2525
```
2626

27-
It appends to the document the new, dynamically created, tag `<script src="…">`. The browser loads and executes it.
27+
Ši funkcija prideda (*appends*) naują, dinamiškai sukurtą žymą (*tag*) `<script src="…">`. Naršyklės ją užkrauna ir įvykdo.
2828

29-
We can use this function like this:
29+
Šią funkciją mes galime panaudoti šitaip:
3030

3131
```js
32-
// load and execute the script at the given path
32+
// užkrauti ir vykdyti nurodytoje vietoje esantį skriptą
3333
loadScript('/my/script.js');
3434
```
3535

36-
The script is executed "asynchronously", as it starts loading now, but runs later, when the function has already finished.
36+
Skriptas yra vykdomas „asinchroniškai“. Jis pradeda krautis dabar, bet įvykdomas vėliau, kai funkcijos vykdymas jau būna pasibaigęs.
3737

38-
If there's any code below `loadScript(…)`, it doesn't wait until the script loading finishes.
38+
Jeigu po `loadScript(…)` yra papildomas kodas, jis nelauks kol pasibaigs skripto krovimasis.
3939

4040
```js
4141
loadScript('/my/script.js');
42-
// the code below loadScript
43-
// doesn't wait for the script loading to finish
42+
// kodas žemiau loadScript
43+
// nelauks kol šio skripto krovimasis baigsis
4444
// ...
4545
```
4646

47-
Let's say we need to use the new script as soon as it loads. It declares new functions, and we want to run them.
47+
Sakykime, mes norime panaudoti skriptą, kai tik jis užsikraus – galbūt jis deklaruoja naujas funkcijas ir mes norime jas naudoti.
4848

49-
But if we do that immediately after the `loadScript(…)` call, that wouldn't work:
49+
Bet šitai nesuveiks, jei to imsimės tuoj po `loadScript(…)` iškvietimo:
5050

5151
```js
52-
loadScript('/my/script.js'); // the script has "function newFunction() {…}"
52+
loadScript('/my/script.js'); // skriptas savyje turi funkciją "function newFunction() {…}"
5353

5454
*!*
55-
newFunction(); // no such function!
55+
newFunction(); // toksios funkcijos nėra!
5656
*/!*
5757
```
5858

59-
Naturally, the browser probably didn't have time to load the script. As of now, the `loadScript` function doesn't provide a way to track the load completion. The script loads and eventually runs, that's all. But we'd like to know when it happens, to use new functions and variables from that script.
59+
Suprantama, naršyklė, greičiausiai, neturėjo laiko užkrauti skriptui. Nuo šio momento funkcija `loadScript` nesuteikia galimybės sekti užsikrovimo baigties. Skriptas užsikrauna ir tiesiog yra įvykdomas. Bet mūsų tikslas yra žinoti, kada tai įvyksta, kad galėtume naudoti minėto skripto sukurtas naujas funkcijas ir kintamuosius.
6060

61-
Let's add a `callback` function as a second argument to `loadScript` that should execute when the script loads:
61+
Pridėkime `callback` funkciją kaip antrą `loadScript` funkcijos argumentą, kuri turėtų būti vykdoma, kai skriptas užsikraus:
6262

6363
```js
6464
function loadScript(src, *!*callback*/!*) {
@@ -73,19 +73,19 @@ function loadScript(src, *!*callback*/!*) {
7373
}
7474
```
7575

76-
Now if we want to call new functions from the script, we should write that in the callback:
76+
Jeigu mes norime iškviesti naujas funkcijas iš skripto, mes turėtume tai aprašyti *callback'e*:
7777

7878
```js
7979
loadScript('/my/script.js', function() {
80-
// the callback runs after the script is loaded
81-
newFunction(); // so now it works
80+
// callback'as vykdomas po skripto užsikrovimo
81+
newFunction(); // dabar fukncija veikia
8282
...
8383
});
8484
```
8585

86-
That's the idea: the second argument is a function (usually anonymous) that runs when the action is completed.
86+
Idėja tokia: antrasis argumentas yra funkcija (dažniausia anoniminė), kuri paleidžiama, kai veiksmas yra užbaigtas.
8787

88-
Here's a runnable example with a real script:
88+
Štai veikiantis pavyzdys su realiu skriptu:
8989

9090
```js run
9191
function loadScript(src, callback) {
@@ -98,20 +98,20 @@ function loadScript(src, callback) {
9898
*!*
9999
loadScript('https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js', script => {
100100
alert(`Cool, the script ${script.src} is loaded`);
101-
alert( _ ); // function declared in the loaded script
101+
alert( _ ); // funkcija deklaruota užkrautame skripte
102102
});
103103
*/!*
104104
```
105105

106-
That's called a "callback-based" style of asynchronous programming. A function that does something asynchronously should provide a `callback` argument where we put the function to run after it's complete.
106+
Tai vadinama *callback'ais* grįstu (*callback-based*) asinchroniniu programavimu – kažką asinchroniškai vykdanti funkcija, turėtų savyje turėti *callback* argumentą, į kurią galima įdėti kitą funkciją, įvykdomą pirmajai pasibaigus.
107107

108-
Here we did it in `loadScript`, but of course, it's a general approach.
108+
Mes panašiai paderėme pavyzdynėje `loadScript` funkcijoje.
109109

110-
## Callback in callback
110+
## *Callback* funkcija *callback* funkcijoje
111111

112-
How can we load two scripts sequentially: the first one, and then the second one after it?
112+
O kaip paleisti du skriptus paeiliui? Pirmą, o po jo – antrą.
113113

114-
The natural solution would be to put the second `loadScript` call inside the callback, like this:
114+
Naturalus sprendimas būtų įdėti antrąjį `loadScript` išvietimą *callbacke*, štai taip:
115115

116116
```js
117117
loadScript('/my/script.js', function(script) {
@@ -127,9 +127,9 @@ loadScript('/my/script.js', function(script) {
127127
});
128128
```
129129

130-
After the outer `loadScript` is complete, the callback initiates the inner one.
130+
Kai išorinė `loadScript` funkcija įvykdoma, *callbackas* inicijuoja vidinę.
131131

132-
What if we want one more script...?
132+
O kas, jeigu mums reikalingas dar vienas skriptas?
133133

134134
```js
135135
loadScript('/my/script.js', function(script) {
@@ -138,7 +138,7 @@ loadScript('/my/script.js', function(script) {
138138

139139
*!*
140140
loadScript('/my/script3.js', function(script) {
141-
// ...continue after all scripts are loaded
141+
// ...tęsti tik visiems skriptams užsikrovus
142142
});
143143
*/!*
144144

@@ -147,13 +147,13 @@ loadScript('/my/script.js', function(script) {
147147
});
148148
```
149149

150-
So, every new action is inside a callback. That's fine for few actions, but not good for many, so we'll see other variants soon.
150+
Taigi, kekviena nauja operacija yra *callbacko* viduje. Tai priimtina nedideliam kiekiui operacijų. Kitus šios problemos spredimo būdus aptarsime netrukus.
151151

152-
## Handling errors
152+
## Tikdžių valdymas
153153

154-
In the above examples we didn't consider errors. What if the script loading fails? Our callback should be able to react on that.
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.
155155

156-
Here's an improved version of `loadScript` that tracks loading errors:
156+
Štai patobulinta `loadScript` versija, kuri suseka krovimosi trikdžius.
157157

158158
```js
159159
function loadScript(src, callback) {
@@ -169,32 +169,32 @@ function loadScript(src, callback) {
169169
}
170170
```
171171

172-
It calls `callback(null, script)` for successful load and `callback(error)` otherwise.
172+
Ji iškviečia `callback(null, script)` sėkmingam krovimui ir `callback(error)` – nesėkmingam.
173173

174-
The usage:
174+
Panaudojimas:
175175
```js
176176
loadScript('/my/script.js', function(error, script) {
177177
if (error) {
178-
// handle error
178+
// suvaldomas trikdis
179179
} else {
180-
// script loaded successfully
180+
// skriptas užkrautas sėkmingai
181181
}
182182
});
183183
```
184184

185-
Once again, the recipe that we used for `loadScript` is actually quite common. It's called the "error-first callback" style.
185+
Būdas, kuriuo mes pasinaudojome paleisti `loadScript`, yra gan dažnas. Jis pirmenybę teikia trikdžių valdymui *callbackais* ("error-first callback style").
186186

187-
The convention is:
188-
1. The first argument of the `callback` is reserved for an error if it occurs. Then `callback(err)` is called.
189-
2. The second argument (and the next ones if needed) are for the successful result. Then `callback(null, result1, result2…)` is called.
187+
Šio stiliaus konvencija teigia:
188+
1. Pirmasis *callbacko* argumentas yra rezervuotas trikdžiui, jei jis pasitaikys. Čia kviečiama `callback(err)` funkcija.
189+
2. Antrasis argumentas (ir tolimesni, jei jie reikalingi) yra skirtas sėkmingam rezultatui. Tuomet kviečiama `callback(null, result1, result2…)` funkcija.
190190

191-
So the single `callback` function is used both for reporting errors and passing back results.
191+
Taigi, viena `callback` funkcija yra tinkama ir informavimui apie trikdžius ir rezultatų grąžinimui.
192192

193-
## Pyramid of Doom
193+
## „Pražūties piraminė“ (Pyramid of Doom)
194194

195-
From the first look, it's a viable way of asynchronous coding. And indeed it is. For one or maybe two nested calls it looks fine.
195+
Iš pirmo žvilgstio – tai geras būdas asinchroniniam kodavimui. Vienam ar dviem sugrupuotiems funkcijų išvietimams jis tikrai tinka.
196196

197-
But for multiple asynchronous actions that follow one after another we'll have code like this:
197+
Bet didesniam kiekiui viena kitą sekančių asinchroninių operacijų mes turėsime štai tokį kodą:
198198

199199
```js
200200
loadScript('1.js', function(error, script) {
@@ -213,7 +213,7 @@ loadScript('1.js', function(error, script) {
213213
handleError(error);
214214
} else {
215215
*!*
216-
// ...continue after all scripts are loaded (*)
216+
// ...tęsti užsikrovus visiems skriptams (*)
217217
*/!*
218218
}
219219
});
@@ -224,14 +224,14 @@ loadScript('1.js', function(error, script) {
224224
});
225225
```
226226

227-
In the code above:
228-
1. We load `1.js`, then if there's no error.
229-
2. We load `2.js`, then if there's no error.
230-
3. We load `3.js`, then if there's no error -- do something else `(*)`.
227+
Šiame kode:
228+
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 `(*)`.
231231

232-
As calls become more nested, the code becomes deeper and increasingly more difficult to manage, especially if we have real code instead of `...` that may include more loops, conditional statements and so on.
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.
233233

234-
That's sometimes called "callback hell" or "pyramid of doom."
234+
Tai kartais vadinama „*callbackų* pragaru“ arba „pražūties piramide“.
235235

236236
<!--
237237
loadScript('1.js', function(error, script) {
@@ -259,11 +259,11 @@ loadScript('1.js', function(error, script) {
259259

260260
![](callback-hell.svg)
261261

262-
The "pyramid" of nested calls grows to the right with every asynchronous action. Soon it spirals out of control.
262+
Sugrupuotų funkcijų išvietimų piramidė auga su kiekviena asinchronine operacija ir greitai tampa nekontroliuojama.
263263

264-
So this way of coding isn't very good.
264+
Todėl toks kodo rašymo būdas nėra labai geras.
265265

266-
We can try to alleviate the problem by making every action a standalone function, like this:
266+
Galime sušvelninti padėtį paversdami kiekvieną veiksmą savarankiška funkcija štai taip:
267267

268268
```js
269269
loadScript('1.js', step1);
@@ -295,12 +295,12 @@ function step3(error, script) {
295295
};
296296
```
297297

298-
See? It does the same, and there's no deep nesting now because we made every action a separate top-level function.
298+
Matote? Ji daro tą patį, bet šiuo atveju nebeligo komplikuoto operacijų grupavimo, nes kiekvieną veiksmą mes pavertėme atskira *top-level* funkcija.
299299

300-
It works, but the code looks like a torn apart spreadsheet. It's difficult to read, and you probably noticed that one needs to eye-jump between pieces while reading it. That's inconvenient, especially if the reader is not familiar with the code and doesn't know where to eye-jump.
300+
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.
301301

302-
Also, the functions named `step*` are all of single use, they are created only to avoid the "pyramid of doom." No one is going to reuse them outside of the action chain. So there's a bit of namespace cluttering here.
302+
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.
303303

304-
We'd like to have something better.
304+
Mums reikėtų kažko geresnio.
305305

306-
Luckily, there are other ways to avoid such pyramids. One of the best ways is to use "promises," described in the next chapter.
306+
Laimei, yra kitų būtų išvengti minėtų „piramidžių“. Geriausias būdas yra naudoti „pažadus“, aptariamus kitame skyriuje.

0 commit comments

Comments
 (0)