/ / Extraño `Tipo de error no detectado: tipo desconocido devuelto` al devolver una secuencia de` Observable.fromNodeCallback` - meteor, rxjs, redux-observable

Extraño 'error de tipo no capturado: el tipo desconocido devolvió' al devolver una secuencia desde 'Observable.fromNodeCallback' - meteorito, rxjs, redux-observable

Según tengo entendido hasta ahora, el patrón épico es "acciones dentro, acciones fuera".

Uso MeteorJS, necesito seguir la convención de llamar a los métodos de Meteor para interactuar con el servidor.

Que se parecen a esto:

Meteor.call("<function-name>", ...args, callback)

Así que trato de manejar el efecto secundario asíncrono con épico como este:

completedSubscribe es solo un creador de acción: const completedSubscribe = result => {type: SUCCEED, result}

import { Observable } from "rx"

const fromMeteorCall = Observable.fromNodeCallback(Meteor.call)
const subscriptionsEpic = action$ =>
action$.ofType(REQUEST_SUBSCRIBE)
.mergeMap(action => {
const call$ = fromMeteorCall("subscriptions.insert", action.email)
return call$.map(completedSubscribe)
})

Entonces recibí un error: Uncaught TypeError: unknown type returned

Para asegurarme de que realizo acciones de devolución,

Intento llamar a suscribirse:

call$.subscribe(
function (x) { console.log("onNext: success!"); },
function (e) { console.log("onError: %s", e); },
function ()  { console.log("onCompleted"); }
);

Entonces suscribirse funciona perfectamente,

pero épico todavía no puede funcionar y sigue lanzando Uncaught TypeError: unknown type returned.

Creo que podría no ser el problema del método de MeteorJS, Esto podría suceder en otro observable creado a partir de la devolución de llamada.

Tal vez entendí mal algo sobre redux-observable o rxjs, Cualquier opinión sería muy útil.

Respuestas

0 para la respuesta № 1

El error que está recibiendo proviene del mergeMap, no está recibiendo algo quereconoce El problema es que está intentando utilizar RxJS v4, no v5, con redux-observable. Entonces, si bien esto puede ser confuso, intentaré explicar lo que está sucediendo:

Intenta devolver un Observable v4 al v5 mergeMap, por eso falla. Tu action$.ofType().mergeMap() el código es de RxJS v5 porque eso es lo que utiliza redux-observables por defecto, y mergeMap (qué flatMap se llama en v5 pero no en v4). Entonces importas rx que es el nombre del paquete de v4 (v5 se publica actualmente en rxjs, tenga en cuenta el sufijo js). En v5 fromNodeCallback fue renombrado bindNodeCallback, así que esto confirma nuevamente que se trata de v4.

Para resolver esto, te sugiero que elimines v4 y en su lugar usar v5 enteramente. Sin embargo, si de hecho necesita usar v4, tenemos un adaptador para redux-observable que necesitará instalar y usar Adaptador-observable redux-rxjs-v4. Si lo usas, el action$ el observable proporcionado a su epopeya ahora será v4 Observable, lo que significa que deberá cambiar el mergeMap a flatMap (y hay otras diferencias sutiles entre los dos).