Necesito sondear el servidor y actualizar los datos en el lado del cliente. Para eso tengo un despachador que despacha una acción que se llama FRONT_PAGE . La acción se envía una vez que se inicia la aplicación y el cliente debe enviar solicitudes dos veces por segundo. Las solicitudes se están enviando pero recibo el siguiente error.
× TypeError: Object(...)(...) is not a function Observable.pipe A:src/internal/Observable.ts:439 ▶ 2 stack frames were collapsed. doInnerSub A:internal/operators/mergeInternals.ts:71 outerNext A:internal/operators/mergeInternals.ts:53 50 | } 51 | })); 52 | }; > 53 | source.subscribe(new OperatorSubscriber(subscriber, outerNext, function () { | ^ 54 | isComplete = true; 55 | checkComplete(); 56 | }));El código.
import { from, of, timer } from 'rxjs' import { ajax } from 'rxjs/ajax' import { map } from 'rxjs/operators' import { FRONT_PAGE } from './constants' const poll_server = url => { timer(0, 500) .pipe(from(fetch(url)) .pipe((x) => { console.log("Polling server.."); return x }) .pipe(map(response => response.json()))) } export const server_dispatch = action => { switch (action.type) { case FRONT_PAGE: { poll_server('http://localhost:8080/warnings') } default: return of(action) } }el punto final
app.get('/warnings', (req, res) => { console.log("[GET] /warnings") const baseline = req.query.baseline ?? -1 if (version > baseline) { res.send(warnings(alerts.filter(a => a.prediction))) } else if (game) { res.status(204).send({}) } else { res.status(404).send(); } })1. poll_server es una función que casi no tiene efectos y luego devuelve nada/vacío.
Por ejemplo:
// return arg + 1 const lambdaFunction = arg => arg + 1; // returns nothing const lambdaFunction = arg => {arg + 1;}; // return arg + 1 const lambdaFunction = arg => {return arg + 1;}; 2. .pipe(from(fetch(url)).pipe(... ¿Qué estás intentando aquí?
from not no es un operador canalizable. Puede usarlo para crear un observable a partir de una promesa, observableLike o iterador. No como un operador componible.
3. Lo siguiente realmente funciona porque los operadores son en realidad solo funciones (¡por qué se pueden componer tan bien!). Entonces, la función de identidad aquí está bien, pero estoy bastante seguro de que no está haciendo lo que crees que es.
.pipe((x) => { console.log("Polling server.."); return x }) console.log("Polling server..") se ejecutará antes de que se suscriba a su observable. En caso de que esto ocurra, su observable aquí nunca se suscribe (ya que nunca se devuelve), pero imagino que podría ver "Servidor de sondeo..." en la consola de todos modos.
4.
.pipe(x => { console.log("Polling server.."); return x }) .pipe(map(response => response.json())))es lo mismo que:
.pipe( x => { console.log("Polling server.."); return x }, map(response => response.json()) )Eso es porque las aplicaciones de encadenamiento son lo mismo que la composición.
5. server_dispatch solo devuelve un observable para el caso predeterminado en el conmutador. De lo contrario, devuelve undefined . ¿Es ese realmente el comportamiento que desea?