bindCallback
Convierte una API de una callback a una función que retorna un Observable
💡 Si la callback sigue la convención de Node.js, es mejor utilizar bindNodeCallback
Descripción
Dada una función f
de tipo f(x, callback)
retornará una función g
, que al ser llamada como g(x)
, retornará un Observable.
bindCallback
no es un operador, dado que ni su entrada ni su salida son Observables. De entrada recibe una función func
que recibe algunos parámetros. El último parámetro debe ser una función callback, a la que func
hará una llamada cuando haya terminado.
La salida de bindCallback
es una función que recibe los mismos parámetros que func
, exceptuando el último (la callback.) Cuando se llama a la función de salida con argumentos, esta retorna un Observable. Si la función func
hace una llamada a su callback con un solo argumento, el Observable resultante emitirá ese valor. Por el contrario, si se hace una llamada a la callback con más de un valor, el Observable resultante emitirá un array con dichos valores como argumentos.
Es muy importante tener en cuenta que la llamada a la función de entrada func
no se realiza a la vez que la llamada a la función de salida, sino cuando el Observable retornado por la función de salida es suscrito. Esto implica que si func
hace una petición AJAX, dicha petición se hará cada vez que se hace una suscripción al Observable resultante, pero no antes.
El último parámetro opcional, scheduler
, se puede utilizar para controlar en qué momento, a partir de la suscripción al Observable resultante, se hace la llamada a la función func
. Por defecto, con la suscripción al Observable resultante se hace una llamada síncrona a la función func
, pero si se utilizase async
como último parámetro, la llamada a func
se aplazaría. Si se utilizase el planificador asyncScheduler
y se llamase a subscribe
en el Observable resultante, todas las llamadas a funciones que se estuviesen ejecutando acabarían antes de que func
se invocase.
Por defecto, los resultados que se le pasan a la callback se emiten inmediatamente después de que func
invoque a dicha callback. En particular, si la llamada a la callback se hace de forma síncrona, entonces, con la suscripción al Observable resultante también se hará una llamada síncrona a la función next
. Si se quiere aplazar esa llamada, se puede utilizar el asyncScheduler
, como antes. Al utilizar asyncScheduler
, se puede asegurar que func
siempre haga la llamada a su callback de forma asíncrona. Así, se puede evitar a Zalgo...
Nota: El Observable creado por la función de salida siempre emitirá un solo valor y se completará inmediatamente. Si func
hace varias llamadas a la callback, los valores de llamadas subsecuentes no aparecerán en el flujo. Si se necesita escuchar a varias llamadas, probablemente sea mejor utilizar fromEvent
o fromEventPattern
en lugar que bindCallback
.
Si func
depende de algún contexto (this
) que no esté ya vinculado, el contexto de func
será el contexto que tenga la función de salida en el momento en el que se llame. En particular, si func
se llama como un método de algún objeto, sin estar previamente vinculado a un contexto, se recomienda que el contexto de la función de salida se vincule a dicho objeto, para poder preservar el contexto de func
.
Si la función de entrada hace una llamada a su callback al 'estilo Node.js' (ej: el primer argumento de la callback es un parámetro de error opcional señalando si la llamada ha fallado o no), bindNodeCallback
proporciona una gestión de errores más adecuada y probablemente sea una mejor elección que bindCallback
. bindNodeCallback
trata a funciones de este tipo igual que a todas las demás, y los parámetros de error (independientemente de que se proporcionen o no) siempre se interpretarán como un argumento normal de callback.
Ejemplos
Ejemplos de la documentación oficial
Convertir la función getJSON
de jQuery a una API Observable
Recibir un array de argumentos pasados a una callback
Comparar el comportamiento con y sin asyncScheduler
Usar bindCallback
con un método de un objeto
Recursos adicionales
Last updated