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: functii/functii-async.md
+8-4Lines changed: 8 additions & 4 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,7 +2,7 @@
2
2
3
3
Acest enunț a fost introdus în EcmaScript 2017 și face ca o funcție să returneze o promisiune (`Promise`). Funcțiile acestea poartă cuvântul cheie `async` în fața lui `function`. Apariția lor marchează o nouă paradigmă de lucru cu promisiunile.
4
4
5
-
Înainte de apariția acestori funcții, pentru a scrie cod asyncron aveam la îndemână callback-uri și promisiuni. În mod curent, până la apariția async/await ai fi returnat un obiect `Promise` proaspăt instanțiat.
5
+
Înainte de apariția acestor funcții, pentru a scrie cod asincron aveam la îndemână callback-uri și promisiuni. În mod curent, până la apariția async/await ai fi returnat un obiect `Promise` proaspăt instanțiat.
Ceea ce permit funcțiile async/await este posibilitatea de a captura toate erorile ridicate de codul asincron, dar și cel sincron. Deci, folosirea unei structuri `try...catch` este valabilă.
64
63
64
+
## Dependințe cognitive
65
+
66
+
- iteratori
67
+
- generatoare
68
+
65
69
## Referințe
66
70
67
71
-[Asynchronous Adventures in JavaScript: Async/Await](https://medium.com/dailyjs/asynchronous-adventures-in-javascript-async-await-bd2e62f37ffd)
Copy file name to clipboardExpand all lines: functii/generators.md
+111-3Lines changed: 111 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Generators
2
2
3
-
Generatoarele oferă posibilitatea de a parcurge o colecție de date. Este un nou tip de funcții introduse în ECMAScript 2015 care *produc* (*yield* în limba engleză) valori la cerere. Punerea unei steluțe după cuvântul cheie `function`, va semnala că avem de a face cu o funcție generator. Funcțiile săgeată nu pot fi iteratori.
3
+
Generatoarele oferă posibilitatea de a parcurge o colecție de date. Este un nou tip de funcții introduse în ECMAScript 2015 care *produc* (*yield* în limba engleză) valori la cerere. Punerea unei steluțe după cuvântul cheie `function`, va semnala că avem de a face cu o funcție generator. O funcție generator este ceva mai specială pentru că la momentul invocării sale, nu se execută codul intern, ci este returnat un obiect iterator. Funcțiile săgeată nu pot fi iteratori.
4
4
5
5
```javascript
6
6
function*ceva () {
@@ -17,7 +17,7 @@ x.next(); // încearcă să mai scoți un rezultat
17
17
18
18
Acest nou tip de lucru cu funcțiile se bazează pe faptul că accesul la date se face cu ajutorul iteratoarelor. Atunci când execuți un generator se creează un nou obiect iterator. Standardul menționează că acest obiect nou generat poate suporta și subclase. Un obiect iterator știe cum să acceseze elementele unei colecții unul după altul până la epuizarea lor. Acest obiect are niște metode disponibile pentru a iniția evaluarea expresiilor după cuvântul cheie `yield`. După evaluare, execuția generatorului se oprește în așteptarea unui nou apel al metodei `next()`. Poți percepe un generator ca un program care se execută la cerere și în etape. Fiecare etapă marcată de `yield` are asociată o stare.
19
19
20
-
Apelarea unui generator nu îl execută, ci doar este trimisă funcția în stiva apelurilor și imediat este suspendată execuția. De fapt, la apelare este returnat un obiect iterator. Obiectul iterator ține o referință către contextul de execuție al generatorului care este în call-stack. După ce au fost evaluate toate expresiile până la întâlnirea primului `yield`, contextul de execuție al generatorului va fi scos din stiva de apeluri, dar obiectul iterator care s-a creat, va ține minte acest context de execuție. Execuția metodei `next()` nu creează un nou context de execuție precum în cazul clasic, ci doar reactivează contextul de execuție al generatorului pe care-l împinge din nou în callstack. Se continuă execuția de unde a rămas începând cu expresiile de după `yield`. Codul este evaluat până la întâlnirea următorului `yield`, când execuția este suspendată din nou, nu înainte de a actualiza obiectul iterator care ține minte starea - ține viu contextul de execuție. Acest ultim aspect oferă un mare avantaj al generatoarelor pentru că rețin valorile între diferitele etape parcurse cu `next()`.
20
+
Apelarea unui generator nu îl execută, ci doar este trimisă funcția în stiva apelurilor și imediat este suspendată execuția, fiind returnat un obiect iterator. Obiectul iterator ține o referință către contextul de execuție al generatorului care este în call-stack. După ce au fost evaluate toate expresiile până la întâlnirea primului `yield`, contextul de execuție al generatorului va fi scos din stiva de apeluri, dar obiectul iterator care s-a creat, va ține minte acest context de execuție. Execuția metodei `next()` nu creează un nou context de execuție precum în cazul clasic, ci doar reactivează contextul de execuție al generatorului pe care-l împinge din nou în callstack. Se continuă execuția de unde a rămas începând cu expresiile de după `yield`. Codul este evaluat până la întâlnirea următorului `yield`, când execuția este suspendată din nou, nu înainte de a actualiza obiectul iterator care ține minte starea - ține viu contextul de execuție. Acest ultim aspect oferă un mare avantaj al generatoarelor pentru că rețin valorile între diferitele etape parcurse cu `next()`.
21
21
22
22
Dacă în execuție nu mai este întâlnit niciun `yield`, funcția generator returnează obiectul iterator, care în acest moment va avea valoarea `true` asociată cheii `done`.
23
23
@@ -32,9 +32,11 @@ var genob = parcurgObiect();
32
32
genob.next();
33
33
```
34
34
35
+
Datorită acestui comportament al generatoarelor prin care este permisă întreruperea execuției, în practică mai sunt numite și **corutine**.
36
+
35
37
## Procesare de generatoare
36
38
37
-
Funcțiile generator pot procesa alte funcții generator.
39
+
Funcțiile generator pot procesa alte funcții generator. Expresia `yield*` este folosită în cazul în care dorești să delegi execuția către un alt generator sau obiect iterator. Asigură-te că expresia care stă după `yield*` este un obiect iterabil. Generatoarele sunt obiecte iterabile pentru că implementează protocoalele `iterable` și `iterator`.
38
40
39
41
```javascript
40
42
function*unGen () {
@@ -49,6 +51,8 @@ for (let obiRet of unGen()) {
49
51
};
50
52
```
51
53
54
+
Ceea ce se petrece atunci când `yield*` este aplicat unui obiect iterabil este că va face `yield` pentru toate valorile din obiectul iterabil căruia i se aplică.
55
+
52
56
## Trimiterea mesajelor
53
57
54
58
Un lucru foarte interesant care privește funcțiile generator este că se pot trimite mesaje din funcție în obiectul iterator instanțiat și invers.
@@ -326,8 +330,112 @@ for(let element of parcurgDOM(elementDOM)){
326
330
};
327
331
```
328
332
333
+
## Corutine
334
+
335
+
Corutinele sunt un model de organizare a executării funcțiilor care își întrerup execuția pentru a ceda controlul alteia. JavaScript nu are un mecanism dedicat realizării corutinelor. Cel mai apropiat fiind totuși generatoarele care prin `yield`, cedează controlul unui alt context de execuție, iar la momentul oportun își reiau execuția. Corutinele sunt un mecanism care în loc să folosească callback-urile, fac uz de *event loop*.
336
+
337
+
Pentru a gestiona un generator folosind o corutină, trebuie să elaborezi o funcție *wrapper* suplimentară. Aceasta va gestiona următoarea logică necesară:
338
+
339
+
- va apela generatorul și va genera obiectul generator;
340
+
- va apela metoda `next()` pe obiectul generator ceea ce va conduce la executarea întregului cod până când `yield` apare;
341
+
- va apela metoda `next(...)` în care vor fi trimise date către generator.
342
+
343
+
```javascript
344
+
function corutină (funcGenerator) {
345
+
var obiectGenerator =funcGenerator(); // instanțierea obiectului
346
+
obiectGenerator.next(); // execută codul generatorului până la primul yield
347
+
returnfunction (dateDeTrimisÎnGenerator) {
348
+
obiectGenerator.next(dateDeTrimisÎnGenerator);
349
+
};
350
+
};
351
+
```
352
+
353
+
Folosind acest model, funcția *wrapper* oferă mecanismul de interacțiune cu generatorul fără a mai apela metoda `next()` direct pe obiectul generator.
354
+
355
+
```javascript
356
+
var generatorGestionat = corutină (function*gen () {
357
+
var primaVal =yield;
358
+
console.log('Iese prima valoare la primul yield: ', primaVal);
359
+
var aDouaVal =yield;
360
+
console.log('Și a doua valoare: ', aDouaVal);
361
+
});
362
+
generatorGestionat('primo');
363
+
generatorGestionat('secundo');
364
+
```
365
+
366
+
Ținta ar fi ca de fiecare dată când se face un `yield`, o funcție să preia efortul de calcul și să ofere un rezultat. Când corutina și-a încheiat propria execuție, apelează la un alt `yield` din generator.
367
+
368
+
```javascript
369
+
functioncorutine (func) {
370
+
var gen =func(); // creezi generatorul și ceri primul yield
371
+
gen.next();
372
+
returnfunctionoVal (valoare) {
373
+
gen.next(valoare); // valoare este pasat generatorului
374
+
};
375
+
};
376
+
function*gen1 () {
377
+
var intrare; // este valoarea care intră prin argument
378
+
intrare =yield;
379
+
console.log('primul yield: ', intrare);
380
+
intrare =yield;
381
+
console.log('al doilea yield: ', intrare);
382
+
};
383
+
function*gen2 () {
384
+
var intrare; // este valoarea care intră prin argument
385
+
intrare =yield;
386
+
console.log('primul yield din a doua corutină: ', intrare);
387
+
intrare =yield;
388
+
console.log('al doilea yield din a doua corutină: ', intrare);
389
+
};
390
+
var x =corutine(gen1); x('ceva'); // primul yield: ceva
391
+
var y =corutine(gen2); y('altceva'); // primul yield din a doua corutină: altceva
392
+
x('salve'); // al doilea yield: salve
393
+
y('eh'); // al doilea yield din a doua corutină: eh
394
+
```
395
+
396
+
Corutinele pot fi folosite și în scenarii în care sunt gestionate promisiuni.
397
+
398
+
```javascript
399
+
var colectie1 = {a:1, b:'ceva'},
400
+
colectie2 = {x:'a', y:10};
401
+
402
+
var promisiune1 =newPromise(functionexec (resolve, reject) {
403
+
resolve(colectie1);
404
+
});
405
+
var promisiune2 =newPromise(functionexec (resolve, reject) {
Copy file name to clipboardExpand all lines: obiecte/obiecte-interne-standard/Array/introducere-array.md
+10-9Lines changed: 10 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -302,7 +302,7 @@ Mai este un caz al folosirii constructorului în ceea ce privește crearea unui
302
302
303
303

304
304
305
-
### Array-uri „dense” prin aplicarea lui `apply()` moștenit de la `Function`.
305
+
### Array-uri dense prin aplicarea lui `apply()` moștenit de la `Function`.
306
306
307
307
Acesta este un truc pentru a genera array-uri de o dimensiune fixă, dar care, în loc de elemente vide la inițiere, va fi populat cu valori `undefined`. Se folosește `Function.prototype.apply()`, care se poate invoca direct pe `Array` pentru că și `Array`, de fapt este o funcție. Cu rol de contructor, dar o funcție fără niciun dubiu, având acces la `apply()`. Pentru aceasta, contextul va fi obiectul global (în cazul browserului este `window`) sau la `null`. Drept argumente, va fi invocat `apply()` pasându-i-se numărul de elemente dorit:
Ultimul caz din seria de exemple de mai sus, se poate dovedi foarte util în practică. Să presupunem că dorești să generezi un obiect prepopulat cu valori din diferite motive. Acest obiect va avea la bază, între oricare alți membri, o pereche cheie:valoare, care va fi folosit drept indicator al dimensiunii array-ului. Ceea ce se va petrece este că aplicarea lui `fill`, care este aplicat obiectului sămânță în care găsește valoarea dimensiunii viitorului array, va conduce la „umplerea” obiectului cu tot atâția noi membri câți au fost specificați de `length`. Singura limitare este că identificatorii cheilor vor fi indecșii. Valorile care vor popula cheile obiectului, pot fi expresii sau valori simple. Am optat mai sus pentru
343
+
Ultimul caz din seria de exemple de mai sus, se poate dovedi foarte util în practică. Să presupunem că dorești să generezi un obiect prepopulat cu valori din diferite motive. Acest obiect va avea la bază, între oricare alți membri, o pereche cheie:valoare, care va fi folosit drept indicator al dimensiunii array-ului. Ceea ce se va petrece este că aplicarea lui `fill`, care este aplicat obiectului sămânță în care găsește valoarea dimensiunii viitorului array, va conduce la „umplerea” obiectului cu tot atâția noi membri câți au fost specificați de `length`. Singura limitare este că identificatorii cheilor vor fi indecșii. Valorile care vor popula cheile obiectului, pot fi expresii sau valori simple.
344
344
345
345
### Crearea unui array multidimensional
346
346
@@ -388,7 +388,7 @@ console.log(alta);
388
388
389
389
Dacă un array are obiecte drept elemente în cazul în care am dori să facem o copie a acelui array, de fapt am face o copie la referințele către obiecte. În limba engleză vom întâlni această situație cu denumirea *shallow copy* - **copie subțire**.
390
390
391
-
## Manipularea dimensiunii unui array
391
+
## Manipularea dimensiunii
392
392
393
393
### Folosirea proprietății `length`
394
394
@@ -413,14 +413,15 @@ function numaraElementeReale (date) {
413
413
numaraElementeReale(tablou); // 3
414
414
```
415
415
416
-
### Creșterea lungimii array-ului prin introducerea valorii
416
+
### Creșterea lungimii array-ului
417
417
418
418
```javascript
419
419
consttablou= ['x', 'y'];
420
420
tablou.length=3;
421
-
// în acest moment ceea ce s-a întâmplat este că a fost introdus un slot gol în array.
422
421
```
423
422
423
+
În acest moment ceea ce s-a întâmplat este că a fost introdus un slot gol în array.
424
+
424
425
### Scăderea dimensiunii unui array menționând `length`
Resetarea array-urilor la 0 - cele referențiate de altele. Există o variantă distructivă și una nedistructivă.
450
-
Resetarea la 0 a array-urilor dacă se face cu `length` va avea același efect și pentru toate referințele la acel array. Cine va accesa o referință, va descoperi uimit că este 0.
450
+
Resetarea array-urilor la `0` - cele referențiate de altele. Există o variantă distructivă și una nedistructivă.
451
+
Resetarea la `0` a array-urilor dacă se face cu `length` va avea același efect și pentru toate referințele la acel array. Cine va accesa o referință, va descoperi uimit că este `0`.
451
452
452
453
```javascript
453
454
var tablou = ['prima', 'a doua'];
@@ -467,7 +468,7 @@ tablou; // []
467
468
altTablou; // Array [ "prima", "a doua", 1, 2 ]
468
469
```
469
470
470
-
## Operațiuni cu datele din array
471
+
## Operațiuni cu datele
471
472
472
473
Dacă privești la gradul de populare, unele array-uri pot fi socotite **sparse** (în limba română: *cu goluri*), iar altele fără goluri catalogate a fi **dense**.
Copy file name to clipboardExpand all lines: obiecte/obiecte-interne-standard/Function/introducere-function.md
+3-9Lines changed: 3 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -77,9 +77,7 @@ Obiectul pasat ca și context de execuție este menționat între paranteze, fii
77
77
78
78
##### Mecanism de operare a funcțiilor interne ale limbajului
79
79
80
-
Ține minte că și funcțiile interne (metode ale obiectelor interne), se pot bucura de avantajele folosirii lui `apply()`.
81
-
82
-
**În cazul obiectului intern Math**
80
+
Ține minte că și funcțiile interne (metode ale obiectelor interne), se pot bucura de avantajele folosirii lui `apply()`. În cazul obiectului intern Math:
83
81
84
82
```javascript
85
83
var numere = [12, 43, 32, 3];
@@ -88,9 +86,7 @@ var max = Math.max.apply(null, numere); // 43
88
86
var min =Math.min.apply(null, numere); // 3
89
87
```
90
88
91
-
**În cazul obiectului intern Array**
92
-
93
-
Putem crea un array „dens” (adică populat cu valori):
89
+
În cazul obiectului intern `Array` putem crea un array *dens* (adică populat cu valori):
@@ -140,9 +136,7 @@ Un alt exemplu elocvent este întâlnit la gestionarea evenimentelor atunci cân
140
136
141
137
### Function.prototype.call()
142
138
143
-
Apelează o funcție în contextul unui obiect precizat între parantezele rotunde , permițând și pasarea argumentelor funcției. Setează `this` la obiectul pasat și argumentele pot fi pasate așa cum sunt.
144
-
145
-
Argumentele de după specificarea lui `this` sunt pasate funcției apelată cu call.
139
+
Apelează o funcție în contextul unui obiect precizat între parantezele rotunde, permițând și pasarea argumentelor funcției. Setează `this` la obiectul pasat și argumentele pot fi pasate așa cum sunt. Argumentele de după specificarea lui `this` sunt pasate funcției apelată cu `call()`.
0 commit comments