Skip to content

Commit 63d7e0e

Browse files
authored
Merge pull request #45 from Sjesc/promisify
Promisification
2 parents 39af0cc + 35e7f82 commit 63d7e0e

1 file changed

Lines changed: 32 additions & 29 deletions

File tree

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
# Promisification
22

3-
"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.
44

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.
66

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>.
810

911
```js run
1012
function loadScript(src, callback) {
1113
let script = document.createElement('script');
1214
script.src = src;
1315

1416
script.onload = () => callback(null, script);
15-
script.onerror = () => callback(new Error(`Script load error for ${src}`));
17+
script.onerror = () => callback(new Error(`Error de carga de script para ${src}`));
1618

1719
document.head.append(script);
1820
}
1921

20-
// usage:
22+
// uso:
2123
// loadScript('path/script.js', (err, script) => {...})
2224
```
2325

24-
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.
2527

2628
```js
2729
let loadScriptPromise = function(src) {
@@ -33,58 +35,60 @@ let loadScriptPromise = function(src) {
3335
})
3436
}
3537

36-
// usage:
38+
// uso:
3739
// loadScriptPromise('path/script.js').then(...)
3840
```
3941

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`.
4145

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.
4347

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).
4549

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.
4751

4852
```js
4953
function promisify(f) {
50-
return function (...args) { // return a wrapper-function
54+
return function (...args) { // retorna una función de envoltura
5155
return new Promise((resolve, reject) => {
52-
function callback(err, result) { // our custom callback for f
56+
function callback(err, result) { // nuestro callback personalizado para f
5357
if (err) {
5458
reject(err);
5559
} else {
5660
resolve(result);
5761
}
5862
}
5963

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
6165

62-
f.call(this, ...args); // call the original function
66+
f.call(this, ...args); // llama a la función original
6367
});
6468
};
6569
};
6670

67-
// usage:
71+
// uso:
6872
let loadScriptPromise = promisify(loadScript);
6973
loadScriptPromise(...).then(...);
7074
```
7175

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.
7377

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)`?
7579

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:
7781

7882
```js
79-
// promisify(f, true) to get array of results
83+
// promisify(f, true) para conseguir array de resultados
8084
function promisify(f, manyArgs = false) {
8185
return function (...args) {
8286
return new Promise((resolve, reject) => {
83-
function *!*callback(err, ...results*/!*) { // our custom callback for f
87+
function *!*callback(err, ...results*/!*) { // Nuestro callback personalizado para f
8488
if (err) {
8589
reject(err);
8690
} else {
87-
// resolve with all callback results if manyArgs is specified
91+
// Retornar todos los resultados del callback si manyArgs es especificado
8892
*!*resolve(manyArgs ? results : results[0]);*/!*
8993
}
9094
}
@@ -96,19 +100,18 @@ function promisify(f, manyArgs = false) {
96100
};
97101
};
98102

99-
// usage:
103+
// Uso:
100104
f = promisify(f, true);
101105
f(...).then(arrayOfResults => ..., err => ...)
102106
```
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.
103108
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.
107110
108111
```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.
110113

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.
112115

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.
114117
```

0 commit comments

Comments
 (0)