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/03-promise-chaining/article.md
+26-26Lines changed: 26 additions & 26 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,11 +3,11 @@
3
3
4
4
Să ne întoarcem la problema menționată în capitolul <info:callbacks>: avem o secvență de sarcini asincrone care trebuie efectuate una după alta - de exemplu, încărcarea scripturilor. Cum putem să o codăm bine?
5
5
6
-
Promisiunile oferă câteva rețete pentru a face acest lucru.
6
+
Promisiunile oferă câteva rețete pentru a face asta.
7
7
8
8
În acest capitol acoperim înlănțuirea promisiunilor.
9
9
10
-
Arată în felul următor:
10
+
Arată așa:
11
11
12
12
```js run
13
13
newPromise(function(resolve, reject) {
@@ -42,11 +42,11 @@ Aici fluxul este următorul:
42
42
43
43
Pe măsură ce rezultatul este transmis de-a lungul lanțului de gestionari, putem vedea o secvență de apeluri `alert`: `1` -> `2` -> `4`.
44
44
45
-

45
+

46
46
47
47
Totul funcționează, deoarece fiecare apel la un `.then` returnează o nouă promisiune, astfel încât să putem apela următorul `.then` pe ea.
48
48
49
-
Atunci când un gestionar returnează o valoare, aceasta devine rezultatul acelei promisiuni, astfel încât următorul `.then` este apelat cu ea.
49
+
Atunci când un gestionar returnează o valoare, aceasta devine rezultatul acelei promisiuni, așa că următorul `.then` este apelat cu ea.
50
50
51
51
**O greșeală clasică de începător: tehnic putem deasemeni adăuga mai multe `.then` la o singură promisiune. Aceasta nu este o înlănțuire.**
Ceea ce am făcut aici este doar mai mulți gestionari pentru o promisiune. Aceștia nu își transmit rezultatul unul altuia, ci îl procesează independent.
75
+
Ceea ce am făcut aici este doar mai mulți gestionari pentru o promisiune. Aceștia nu își transmit rezultatul unul altuia; în schimb îl procesează independent.
76
76
77
77
Iată imaginea (comparați-o cu înlănțuirea de mai sus):
78
78
79
79

80
80
81
-
Toate `.then` pe aceeași promisiune obțin același rezultat - rezultatul acelei promisiuni. Deci în codul de mai sus toate `alert` arată același: `1`.
81
+
Toate `.then` pe aceeași promisiune obțin același rezultat -- rezultatul acelei promisiuni. Deci în codul de mai sus toate `alert` arată același: `1`.
82
82
83
-
În practică avem rareori nevoie de mai mulți gestionari pentru o promisiune. Înlănțuirea este folosită mult mai des.
83
+
În practică avem rareori nevoie de multipli gestionari pentru o promisiune. Înlănțuirea este folosită mult mai des.
84
84
85
85
## Promisiuni care se întorc
86
86
@@ -101,7 +101,7 @@ new Promise(function(resolve, reject) {
101
101
102
102
*!*
103
103
returnnewPromise((resolve, reject) => { // (*)
104
-
setTimeout(() =>resolve(rezultat*2), 1000);
104
+
setTimeout(() =>resolve(result*2), 1000);
105
105
});
106
106
*/!*
107
107
@@ -120,9 +120,9 @@ new Promise(function(resolve, reject) {
120
120
});
121
121
```
122
122
123
-
Aici primul `.then` arată `1` și returnează `new Promise(…)` în linia `(*)`. După o secundă se rezolvă, iar rezultatul (argumentul lui `resolve`, aici este `result * 2`) este transmis către gestionarul celui de-al doilea `.then`. Acest gestionar se află în linia `(**)`, arată `2` și face același lucru.
123
+
Aici primul `.then` arată `1` și returnează `new Promise(…)` în linia `(*)`. După o secundă se rezolvă, iar rezultatul (argumentul lui `resolve`, aici este `result * 2`) este transmis către gestionarul celui de-al doilea `.then`. Acel gestionar se află în linia `(**)`, arată `2` și face același lucru.
124
124
125
-
Deci, rezultatul este același ca în exemplul anterior: 1 -> 2 -> 4, dar acum cu o întârziere de 1 secundă între apelurile `alert`.
125
+
Deci rezultatul este același ca în exemplul anterior: 1 -> 2 -> 4, dar acum cu o întârziere de 1 secundă între apelurile `alert`.
126
126
127
127
Returnarea promisiunilor ne permite să construim lanțuri de acțiuni asincrone.
// scripturile sunt încărcate, putem folosi funcțiile declarate acolo
158
158
one();
159
-
două();
160
-
trei();
159
+
two();
160
+
three();
161
161
});
162
162
```
163
163
164
164
165
-
Aici fiecare apel `loadScript` returnează o promisiune, iar următorul `.then`se execută atunci când se soluționează. Apoi inițiază încărcarea următorului script. Așa că scripturile sunt încărcate unul după altul.
165
+
Aici fiecare apel `loadScript` returnează o promisiune, iar următorul `.then`rulează atunci când se soluționează. Apoi inițiază încărcarea următorului script. Așa că scripturile sunt încărcate unul după altul.
166
166
167
167
Putem adăuga mai multe acțiuni asincrone în lanț. Vă rugăm să rețineți că acest cod este încă "plat" - crește în jos, nu spre dreapta. Nu există semne de "piramida osândei".
// această funcție are acces la variabilele script1, script2 și script3
176
176
one();
177
-
doi();
178
-
trei();
177
+
two();
178
+
three();
179
179
});
180
180
});
181
181
});
@@ -193,7 +193,7 @@ Pentru a fi mai precis, un gestionar poate returna nu chiar o promisiune, ci un
193
193
194
194
Ideea este că bibliotecile terțe pot implementa propriile obiecte "compatibile cu promisiunile". Acestea pot avea un set extins de metode, dar pot fi de asemenea compatibile cu promisiunile native, deoarece implementează `.then`.
@@ -224,7 +224,7 @@ Această caracteristică ne permite să integrăm obiecte personalizate în lan
224
224
225
225
## Exemplu mai mare: fetch
226
226
227
-
În programarea frontend, promisiunile sunt adesea folosite pentru network requests. Să vedem deci un exemplu extins în acest sens.
227
+
În programarea frontend, promisiunile sunt adesea folosite pentru network requests. Să vedem deci un exemplu extins despre asta.
228
228
229
229
Vom folosi metoda [fetch](info:fetch) pentru a încărca informațiile despre utilizator de pe remote server. Aceasta are o mulțime de parametri opționali acoperiți în [capitole separate](info:fetch), dar sintaxa de bază este destul de simplă:
230
230
@@ -242,7 +242,7 @@ Codul de mai jos face o cerere către `user.json` și încarcă textul acestuia
242
242
fetch('/article/promise-chaining/user.json')
243
243
// .then de mai jos rulează când remote server răspunde
244
244
.then(function(response) {
245
-
// response.text() returnează o nouă promisiune care se rezolvă cu textul complet al răspunsului
245
+
// response.text() returnează o nouă promisiune care se rezolvă cu întregul response text
.then(githubUser=>alert(`A terminat de arătat ${githubUser.name}`));
320
320
```
321
321
322
-
Adică, gestionarul `.then` din linia `(*)` acum returnează `newPromise`, care devine soluționată numai după apelul lui `resolve(githubUser)` în `setTimeout``(**)`. Următorul `.then` din lanț va aștepta acest lucru.
322
+
Adică, gestionarul `.then` din linia `(*)` acum returnează `new Promise`, care devine soluționată numai după apelul lui `resolve(githubUser)` în `setTimeout``(**)`. Următorul `.then` din lanț va aștepta pentru aceasta.
323
323
324
-
Ca o bună practică, o acțiune asincronă ar trebui să returneze întotdeauna o promisiune. Acest lucru face posibilă planificarea acțiunilor după ea; chiar dacă nu plănuim să extindem lanțul acum, s-ar putea să avem nevoie de el mai târziu.
324
+
Ca o bună practică, o acțiune asincronă ar trebui să returneze întotdeauna o promisiune. Asta face posibilă planificarea acțiunilor după ea; chiar dacă nu plănuim să extindem lanțul acum, s-ar putea să avem nevoie de el mai târziu.
325
325
326
326
În cele din urmă, putem împărți codul în funcții reutilizabile:
327
327
@@ -342,7 +342,7 @@ function showAvatar(githubUser) {
0 commit comments