代码之家  ›  专栏  ›  技术社区  ›  Lukasz 'Severiaan' Grela

如何循环epic呼叫

  •  1
  • Lukasz 'Severiaan' Grela  · 技术社区  · 6 年前

    我有以下几点:

    import {
      map,
      catchError,
      switchMap,
      takeUntil,
    } from 'rxjs/operators';
    import {
      FETCH_JOKES,
      jokesReceived,
      FETCH_JOKES_CANCELLED,
      jokesFetchFailed,
    } from '../actions/jokes-action';
    import { ofType } from 'redux-observable';
    import { of, concat } from 'rxjs';
    import { ajax } from 'rxjs/ajax';
    
    const getJokes = () =>
      ajax.getJSON('http://api.icndb.com/jokes/random?escape=javascript');
    
    const fetchJokesEpic = action$ => {
      return action$.pipe(
        ofType(FETCH_JOKES),
        switchMap(() =>
          getJokes().pipe(
            map(response => jokesReceived(response)),
            catchError((err, act) => of(jokesFetchFailed(err))),
            takeUntil(action$.pipe(ofType(FETCH_JOKES_CANCELLED)))
          )
        ),
      );
    };
    
    export default fetchJokesEpic;
    

    每当 FETCH_JOKES ajax 呼叫和成功调度 jokesReceived 行动或失败 jokesFetchFailed .

    我想循环它,所以除非取消端点将再次调用后,上一次调用将完成(成功或失败)。

    我想我可以用另一个史诗塔特将作出反应 JOKES_RECEIVED FETCH_JOKES_ERROR 行动和调度 取来你的笑话

    import { ofType } from 'redux-observable';
    import {
      delay,
      map,
    } from 'rxjs/operators';
    import {
      JOKES_RECEIVED,
      FETCH_JOKES_CANCELLED,
      FETCH_JOKES_ERROR,
      fetchJokes,
    } from '../actions/jokes-action';
    
    const pollJokes = (action$, state$) => {
      return action$.pipe(
        ofType(JOKES_RECEIVED, FETCH_JOKES_ERROR, FETCH_JOKES_CANCELLED),
        delay(2000),
        map(action => {
          console.log('pollJokes.map', action);
          if(action.type === FETCH_JOKES_CANCELLED)
          { 
            console.log("Cancelled")
            return { type: 'POLL_STOPPED' };
          }
          else {
            // loop
            return fetchJokes();
          }
        })
      );
    };
    export default pollJokes;
    

    然而,这不工作时,我派遣 FETCH_JOKES_CANCELLED 行动。操作堆栈如下所示:

    @INIT
    FETCH_JOKES
    JOKES_RECEIVED
    FETCH_JOKES
    JOKES_RECEIVED
    ...
    FETCH_JOKES_CANCELLED
    FETCH_JOKES
    JOKES_RECEIVED
    POLL_STOPPED
    FETCH_JOKES
    JOKES_RECEIVED
    ...
    

    takeUntil pollJokes 史诗般的,但同样糟糕的结果

    const pollJokes = (action$, state$) => {
      return action$.pipe(
        ofType(JOKES_RECEIVED, FETCH_JOKES_ERROR, FETCH_JOKES_CANCELLED),
        delay(2000),
        map(action => {
          console.log('pollJokes.map', action);
          if(action.type === FETCH_JOKES_CANCELLED)
          { 
            console.log("Cancelled")
            return { type: 'POLL_STOPPED' };
          }
          else {
            // loop
            return fetchJokes();
          }
        }),
    
    
        takeUntil(action$.pipe(ofType(FETCH_JOKES_CANCELLED)))
    
    
      );
    };
    

    波尔笑话 获取\u已取消\u takeUntil公司 .

    fetchJokes 什么时候 你收到的笑话

    1 回复  |  直到 6 年前
        1
  •  2
  •   Anas    6 年前

    你需要使用 repeat ,以重新启动您的史诗,一旦它被取消 takeUntil

    const pollJokes = (action$, state$) => {
      return action$.pipe(
        ofType(JOKES_RECEIVED, FETCH_JOKES_ERROR, FETCH_JOKES_CANCELLED),
        delay(2000),
        map(action => {
          console.log('pollJokes.map', action);
          if(action.type === FETCH_JOKES_CANCELLED)
          { 
            console.log("Cancelled")
            return { type: 'POLL_STOPPED' };
          }
          else {
            // loop
            return fetchJokes();
          }
        }),
    
    
        takeUntil(action$.pipe(ofType(FETCH_JOKES_CANCELLED))),
        repeat()
    
      );
    };
    
    推荐文章