rxjs обрабатывает ajax-запрос - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь применить метод ajax, опубликованный здесь: https://github.com/redux-observable/redux-observable/blob/master/docs/basics/Epics.md

import { ajax } from 'rxjs/ajax';

// action creators
const fetchUser = username => ({ type: FETCH_USER, payload: username });
const fetchUserFulfilled = payload => ({ type: FETCH_USER_FULFILLED, payload });

// epic
const fetchUserEpic = action$ => action$.pipe(
  ofType(FETCH_USER),
  mergeMap(action =>
    ajax.getJSON(`https://api.github.com/users/${action.payload}`).pipe(
      map(response => fetchUserFulfilled(response))
    )
  )
);

// later...
dispatch(fetchUser('torvalds'));

При попытке этого метода я получаю сообщение:

TypeError: Object (...) (...). pipe не является функцией

Таким образом, pipe не существует.(Это касается второго канала после вызова ajax).
Как это исправить?

Я установил следующие зависимости:

"rxjs": "^6.5.2",
"rxjs-compat": "^6.5.2",

Редактировать:

Я изменил свой код на ajax.get и код вызова:

export const fetchTrendingEpic = action$ => action$.pipe(
    ofType(FETCH_TRENDING_REQUEST),
    mergeMap(async(action) => {
        const res = await fetchPostStats(action.payload);
        console.log(res);
        res.pipe(
          map(response => {
            console.log('response', response);
            setTrendingPlaces({trendingPlaces: response});
          })
        )
    })
);

Res был правильно напечатан (показывает наблюдаемое), но теперь я получаю сообщение об ошибке:

TypeError: Невозможно прочитать свойство 'type' из неопределенного

Вот какЯ создаю свой магазин в dev:

const createEnhancer = (epicMiddleware) => {
  const middleware = [ epicMiddleware, createLogger() ];

  let enhancer;
  if (getEnvironment() === 'development') {
    enhancer = composeWithDevTools(
      applyMiddleware(...middleware),
      // other store enhancers if any
    );

  };

export default (initialState) => {
  const epicMiddleware = createEpicMiddleware();
  const enhancer = createEnhancer(epicMiddleware);
  const store = createStore(rootReducer, initialState, enhancer);
  epicMiddleware.run(rootEpic);
  return store;
}

Редактируем заметку:

Это код, выполняемый в NodeJS (SSR).
Я борюсь с этим, не совсем понимаюкак это может быть так трудно заставить работать без ошибок.
Не совсем понимаю, как будет работать пример кода, когда ajax.getJSON возвращает обещание, а не наблюдаемое ...

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Axios прекрасно работает с rxjs в nodejs, просто делая что-то вроде этого ...

const { from } = require('rxjs');
const { map } = require('rxjs/operators');
const axios = require('axios');

const responsePromise = axios.get('https://jsonplaceholder.typicode.com/todos/1');
const response$ = from(responsePromise);

response$
    .pipe(
        map(response => ({ type: 'RESPONSE_RECEIVED', payload: response.data}))
    )
    .subscribe(console.log);
0 голосов
/ 10 июля 2019

Мой сервис, который вызвал запрос ajax, был помечен как асинхронный, потому что предыдущая реализация использовала Axios до рефакторинга.
По этой причине моя консоль записала обещание как возвращаемое значение функции.
Удаление async возвращает наблюдаемое, как и ожидалось.

Как упоминалось в комментариях @Dez, также необходимо добавить возвращаемые значения.
И последнее, но не менее важное: rxjs ajax не работает в среде NodeJS.
Поэтому на основе этой темы: https://github.com/ReactiveX/rxjs/issues/2099

Я обнаружил, что кто-то создал следующий пакет npm, который я скоро опробую: https://github.com/mcmunder/universal-rxjs-ajax

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...