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
"Promisification" is a long word for a simple transformation. It's the conversion of a function that accepts a callback into a function that returns a promise.
3
+
Promisification (Promisificación) -- es una palabra larga para una simple transformación. Es una conversión: de una función que acepta un callback a una función que retorna una promesa.
4
4
5
-
Such transformations are often required in real-life, as many functions and libraries are callback-based. But promises are more convenient, so it makes sense to promisify them.
5
+
En otras palabras, creamos una función de envoltura que realiza lo mismo, llamando a la original internamente, pero retornando una promesa.
6
6
7
-
For instance, we have `loadScript(src, callback)` from the chapter <info:callbacks>.
7
+
Estas transformaciones son usualmente necesarias en la vida real, ya que muchas funciones y librerías están basadas en callbacks. Pero las promesas son mas convenientes, así que tiene sentido promisificar.
8
+
9
+
Por ejemplo, tenemos `loadScript(src, callback)` del capítulo <info:callbacks>.
Let's promisify it. The new `loadScriptPromise(src)`function achieves the same result, but it accepts only `src` (no `callback`) and returns a promise.
26
+
Vamos a promisificarla. La función nueva `loadScriptPromise(src)`va a hacer lo mismo, pero solo acepta `src` (sin callback) y retorna una promesa.
25
27
26
28
```js
27
29
letloadScriptPromise=function(src) {
@@ -33,58 +35,60 @@ let loadScriptPromise = function(src) {
33
35
})
34
36
}
35
37
36
-
//usage:
38
+
//uso:
37
39
// loadScriptPromise('path/script.js').then(...)
38
40
```
39
41
40
-
Now `loadScriptPromise` fits well in promise-based code.
42
+
Ahora `loadScriptPromise` se ajusta bien a nuestro código basado en promesas.
43
+
44
+
Como podemos ver, le delega todo el trabajo a la función `loadScript` original, proveyendo su propio callback que es traducido a promise `resolve/reject`.
41
45
42
-
As we can see, it delegates all the work to the original `loadScript`, providing its own callback that translates to promise `resolve/reject`.
46
+
Como vamos a tener que promisificar muchas funciones, tiene sentido usar un ayudante.
43
47
44
-
In practice we'll probably need to promisify many functions, so it makes sense to use a helper. We'll call it `promisify(f)`: it accepts a to-promisify function `f`and returns a wrapper function.
48
+
Esto es en realidad muy simple -- La función `promisify(f)` debajo toma una función `f`que sera promisificada y retorna una función de envoltura (wrapper function).
45
49
46
-
That wrapper does the same as in the code above: returns a promise and passes the call to the original `f`, tracking the result in a custom callback:
50
+
Esa envoltura realiza lo mismo que el código de arriba: retorna una promesa y pasa el llamado a la `f` original, rastreando el resultado en un callback personalizado.
47
51
48
52
```js
49
53
functionpromisify(f) {
50
-
returnfunction (...args) { //return a wrapper-function
54
+
returnfunction (...args) { //retorna una función de envoltura
51
55
returnnewPromise((resolve, reject) => {
52
-
functioncallback(err, result) { //our custom callback for f
56
+
functioncallback(err, result) { //nuestro callback personalizado para f
53
57
if (err) {
54
58
reject(err);
55
59
} else {
56
60
resolve(result);
57
61
}
58
62
}
59
63
60
-
args.push(callback); //append our custom callback to the end of f arguments
64
+
args.push(callback); //adjunta nuestro callback personalizado al final de los argumentos
61
65
62
-
f.call(this, ...args); //call the original function
66
+
f.call(this, ...args); //llama a la función original
63
67
});
64
68
};
65
69
};
66
70
67
-
//usage:
71
+
//uso:
68
72
let loadScriptPromise =promisify(loadScript);
69
73
loadScriptPromise(...).then(...);
70
74
```
71
75
72
-
Here we assume that the original function expects a callback with 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.
76
+
Aquí asumimos que la función original espera un callback con dos argumentos`(err, result)`. Eso es lo que usualmente encontramos. Entonces nuestro callback personalizado está exactamente en el formato correcto, y`promisify`funciona muy bien para tal caso.
73
77
74
-
But what if the original `f`expects a callback with more arguments`callback(err, res1, res2, ...)`?
78
+
¿Y si la `f`original espera un callback con más argumentos`callback(err, res1, res2)`?
75
79
76
-
Here's a more advanced version of `promisify`: if called as `promisify(f, true)`, the promise result will be an array of callback results `[res1, res2, ...]`:
80
+
Aquí hay una modificación de `promisify` que retorna un array de los múltiples resultados del callback:
77
81
78
82
```js
79
-
// promisify(f, true) to get array of results
83
+
// promisify(f, true) para conseguir array de resultados
//resolve with all callback results if manyArgs is specified
91
+
//Retornar todos los resultados del callback si manyArgs es especificado
88
92
*!*resolve(manyArgs ? results : results[0]);*/!*
89
93
}
90
94
}
@@ -96,19 +100,18 @@ function promisify(f, manyArgs = false) {
96
100
};
97
101
};
98
102
99
-
//usage:
103
+
//Uso:
100
104
f =promisify(f, true);
101
105
f(...).then(arrayOfResults=>..., err=>...)
102
106
```
107
+
En algunos casos, puede que `err` esté ausente: `callback(result)`, o que haya algo que no es habitual en el formato del callback, por lo que tendremos que promisificar tales funciones manualmente.
103
108
104
-
For more exotic callback formats, like those without `err` at all: `callback(result)`, we can promisify such functions manually without using the helper.
105
-
106
-
There are also modules with a bit more flexible promisification functions, e.g. [es6-promisify](https://github.com/digitaldesignlabs/es6-promisify). In Node.js, there's a built-in `util.promisify` function for that.
109
+
También hay módulos con funciones de promisificación un poco más flexibles, ej. [es6-promisify](https://github.com/digitaldesignlabs/es6-promisify). En Node.js, hay una función integrada `util.promisify` para ello.
107
110
108
111
```smart
109
-
Promisification is a great approach, especially when you use `async/await` (see the next chapter), but not a total replacement for callbacks.
112
+
La promisificación es un excelente enfoque, especialmente cuando usas `async/await` (revisa el siguiente capítulo), pero no es totalmente un substituto para los callbacks.
110
113
111
-
Remember, a promise may have only one result, but a callback may technically be called many times.
114
+
Recuerda, una promesa puede tener sólo un resultado, pero un callback puede ser técnicamente llamado muchas veces.
112
115
113
-
So promisification is only meant for functions that call the callback once. Further calls will be ignored.
116
+
Así que la promisificación está solo pensada para funciones que llaman al callback una vez. Las llamadas adicionales serán ignoradas.
0 commit comments