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/06-promisify/article.md
+18-54Lines changed: 18 additions & 54 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,13 +4,9 @@
4
4
5
5
De telles transformations sont souvent nécessaires dans la vie réelle, car de nombreuses fonctions et bibliothèques sont basées sur des callback. Mais les promesses sont plus pratiques. Il est donc logique de les transformer.
6
6
7
-
<<<<<<< HEAD
8
-
Par exemple, nous avons `loadScript(src, callback)` du chapitre <info:callbacks>.
9
-
=======
10
-
For better understanding, let's see an example.
7
+
Pour une meilleure compréhension, voyons un exemple.
11
8
12
-
For instance, we have `loadScript(src, callback)` from the chapter <info:callbacks>.
13
-
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
9
+
Par exemple, nous avons `loadScript(src, callback)` du chapitre <info:callbacks>.
14
10
15
11
```js run
16
12
functionloadScript(src, callback) {
@@ -27,17 +23,13 @@ function loadScript(src, callback) {
Transformons-le. La nouvelle fonction `loadScriptPromise(src)` fera de même, mais acceptera seulement `src` (pas de `callback`) et renverra une promesse.
32
-
=======
33
-
The function loads a script with the given `src`, and then calls `callback(err)` in case of an error, or `callback(null, script)` in case of successful loading. That's a widespread agreement for using callbacks, we saw it before.
26
+
La fonction charge un script avec le `src` donné, puis appelle `callback(err)` en cas d'erreur, ou `callback (null, script) `en cas de chargement réussi. C'est un accord répandu pour l'utilisation des rappels, nous l'avons vu auparavant.
34
27
35
-
Let's promisify it.
28
+
Promisifions le.
36
29
37
-
We'll make a new function `loadScriptPromise(src)`, that does the same (loads the script), but returns a promise instead of using callbacks.
30
+
Nous allons créer une nouvelle fonction `loadScriptPromise(src)`, qui fait la même chose (charge le script), mais retourne une promesse au lieu d'utiliser des rappels.
38
31
39
-
In other words, we pass it only `src` (no `callback`) and get a promise in return, that resolves with `script` when the load is successful, and rejects with the error otherwise.
40
-
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
32
+
En d'autres termes, nous le transmettons uniquement `src` (pas de `callback`) et obtenons une promesse en retour, qui se résout avec `script` lorsque le chargement est réussi, et sinon rejette avec l'erreur.
41
33
42
34
Here it is:
43
35
```js
@@ -54,35 +46,19 @@ let loadScriptPromise = function(src) {
54
46
// loadScriptPromise('path/script.js').then(...)
55
47
```
56
48
57
-
<<<<<<< HEAD
58
-
Maintenant, `loadScriptPromise` s'intègre bien dans du code basé sur des promesses.
59
-
60
-
Comme nous pouvons le constater, elle délègue tout le travail au `loadScript` d'origine, en fournissant son propre rappel qui se traduit par la promesse de "résoudre/rejeter".
61
-
62
-
En pratique, nous aurons probablement besoin de promettre de nombreuses fonctions. Il est donc logique d'utiliser une fonction assistante. Nous l'appellerons `promisify(f)` : elle accepte une fonction à transformer `f` et renvoie une fonction wrapper.
63
-
64
-
Ce wrapper fait la même chose que dans le code ci-dessus: renvoie une promesse et passe l'appel au `f` d'origine, en suivant le résultat dans un rappel personnalisé:
65
-
66
-
```js
67
-
functionpromisify(f) {
68
-
returnfunction (...args) { // renvoie une fonction wrapper
69
-
returnnewPromise((resolve, reject) => {
70
-
functioncallback(err, result) { // notre rappel personnalisé pour f
71
-
=======
72
-
As we can see, the newfunction is a wrapper around the original `loadScript`function. It calls it providing its own callback that translates to promise `resolve/reject`.
49
+
Comme nous pouvons le voir, la nouvelle fonction est un wrapper autour de la fonction originale `loadScript`. Il l'appelle en fournissant son propre rappel qui se traduit par la promesse de `resolve/reject`.
73
50
74
-
Now `loadScriptPromise` fits well in promise-based code. If we like promises more than callbacks (andsoonwe'll see more reasons for that), then we will use it instead.
51
+
Dorénavant`loadScriptPromise`s'intègre bien dans le code basé sur la promesse. Si nous aimons les promesses plus que les rappels (et bientôt nous verrons plus de raisons à cela), alors nous les utiliserons à la place.
75
52
76
-
In practice we may need to promisify more than one function, so it makes sense to use a helper.
53
+
Dans la pratique, nous pouvons avoir besoin de promettre plus d'une fonction, il est donc logique d'utiliser un assistant.
77
54
78
-
We'llcallit`promisify(f)`:itacceptsato-promisifyfunction`f` and returns a wrapper function.
55
+
Nous l'appellerons `promisify(f)` : il accepte une fonction à promettre `f`et renvoie une fonction wrapper.
79
56
80
57
```js
81
58
functionpromisify(f) {
82
59
returnfunction (...args) { // return a wrapper-function (*)
83
60
returnnewPromise((resolve, reject) => {
84
61
functioncallback(err, result) { // our custom callback for f (**)
85
-
>>>>>>>99e59ba611ab11319ef9d0d66734b0bea2c3f058
86
62
if (err) {
87
63
reject(err);
88
64
} else {
@@ -102,26 +78,18 @@ let loadScriptPromise = promisify(loadScript);
102
78
loadScriptPromise(...).then(...);
103
79
```
104
80
105
-
<<<<<<< HEAD
106
-
Nous supposons ici que la fonction d'origine attend un rappel avec deux arguments `(err, result)`. C'est ce que nous rencontrons le plus souvent. Ensuite, notre rappel personnalisé est exactement au bon format et `promisify` convient parfaitement à un tel cas.
107
-
=======
108
-
The code may look a bit complex, but it's essentially the same that we wrote above, while promisifying `loadScript` function.
81
+
Le code peut sembler un peu complexe, mais c'est essentiellement le même que celui que nous avons écrit ci-dessus, tout en promettant la fonction `loadScript`.
109
82
110
-
A call to`promisify(f)`returns a wrapper around `f``(*)`. That wrapper returns a promise and forwards the call to the original `f`, tracking the result in the custom callback`(**)`.
83
+
Un appel à`promisify(f)`retourne un wrapper autour de `f``(*)`. Ce wrapper renvoie une promesse et transmet l'appel au `f` d'origine, en suivant le résultat dans le rappel personnalisé`(**)`.
111
84
112
-
Here, `promisify` assumes that the original function expects a callback with exactly two arguments `(err, result)`. That's what we encounter most often. Then our custom callback is in exactly the right format, and `promisify` works great for such a case.
113
-
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
85
+
Ici, `promisify` suppose que la fonction d'origine attend un rappel avec exactement deux arguments `(err, result) `. C'est ce que nous rencontrons le plus souvent. Ensuite, notre rappel personnalisé est exactement dans le bon format, et `promisify` fonctionne très bien dans un tel cas.
114
86
115
87
Mais que se passe-t-il si le `f` original attend un rappel avec plus d'arguments `callback(err, res1, res2, ...)`?
116
88
117
-
<<<<<<< HEAD
118
-
Voici une version plus avancée de `promisify`: si elle est appelée par `promisify(f, true)`, le résultat de la promesse sera un tableau de résultats de rappel `[res1, res2, ...]`:
119
-
=======
120
-
We can improve our helper. Let's make a more advanced version of `promisify`.
89
+
Nous pouvons améliorer notre helper. Faisons une version plus avancée de `promisify`.
121
90
122
-
- When called as `promisify(f)` it should work similar to the version above.
123
-
- When called as `promisify(f, true)`, it should return the promise that resolves with the array of callback results. That's exactly for callbacks with many arguments.
124
-
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
91
+
- Lorsqu'il est appelé en tant que `promisify(f)`, il devrait fonctionner de la même manière que la version ci-dessus.
92
+
- Lorsqu'il est appelé en tant que `promisify(f, true)`, il doit retourner la promesse qui se résout avec le tableau des résultats de rappel. C'est exactement pour les rappels avec de nombreux arguments.
125
93
126
94
```js
127
95
// promisify(f, true) pour obtenir un tableau de résultats
@@ -149,13 +117,9 @@ f = promisify(f, true);
149
117
f(...).then(arrayOfResults=>..., err=>...);
150
118
```
151
119
152
-
<<<<<<< HEAD
153
-
Pour des formats de rappel plus exotiques, comme ceux sans `err` : `callback(result)`, nous pouvons transformer de telles fonctions manuellement, sans utiliser la fonction assistante.
154
-
=======
155
-
As you can see it's essentially the same as above, but `resolve` is called with only one or all arguments depending on whether `manyArgs` is truthy.
120
+
Comme vous pouvez le voir, c'est essentiellement la même chose que ci-dessus, mais `resolve` est appelé avec un seul ou tous les arguments selon que `manyArgs` est vrai.
156
121
157
-
For more exotic callback formats, like those without `err` at all: `callback(result)`, we can promisify such functions manually without using the helper.
158
-
>>>>>>> 99e59ba611ab11319ef9d0d66734b0bea2c3f058
122
+
Pour des formats de rappel plus exotiques, comme ceux sans `err` : `callback(result)`, nous pouvons promettre de telles fonctions manuellement sans utiliser l'assistant.
159
123
160
124
Il existe également des modules avec des fonctions de promisification un peu plus flexibles, e.g. [es6-promisify](https://github.com/digitaldesignlabs/es6-promisify). Dans Node.js, il existe une fonction intégrée `util.promisify` pour cela.
0 commit comments