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 № 1El 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).