代码之家  ›  专栏  ›  技术社区  ›  Danny Delott

如何创建一个redux可观察史诗,在做任何事情之前等待2个动作

  •  1
  • Danny Delott  · 技术社区  · 7 年前

    这部史诗在第一次完成后也不需要存在。

    我在想象这样的事情:

    function doTheThing(action$) {
      return action$
         // The start of the sequence
        .ofType(FIRST_ACTION)
    
        // Do nothing until the second action occurs
        .waitForAnotherAction(SECOND_ACTION)
    
        // the correct actions have been dispatched, do the thing!
        .map(() => ({ type: DO_THE_THING_ACTION }))
        .destroyEpic();
    }
    

    这样的事情有可能发生吗 redux-observable ?

    2 回复  |  直到 7 年前
        1
  •  6
  •   paulpdaniels    7 年前

    正如@jayphelps在评论中指出的,根据您是否需要访问各种事件以及事件是否必须严格排序,有两种变体。因此,以下各项都应适用:

    1) 严格的命令不关心事件:

    action$
      .ofType(FIRST_ACTION)
      .take(1)
      .concat(action$.ofType(SECOND_ACTION).take(1))
      .mapTo({ type: DO_THE_THING_ACTION })
    

    action$
      .ofType(FIRST_ACTION)
      .take(1)
      .concatMap(
        a1 => action$.ofType(SECOND_ACTION).take(1),
        (a1, a2) => ({type: DO_THE_THING_ACTION, a1, a2})
      )
    

    3) 非严格命令(做或不做)关心事件

    Observable.forkJoin(
      action$.ofType(FIRST_ACTION).take(1),
      action$.ofType(SECOND_ACTION).take(1),
      // Add this lambda if you *do* care
      (a1, a2) => ({type: DO_THE_THING_ACTION, a1, a2})
    )
    // Use mapTo if you *don't* care
    .mapTo({type: DO_THE_THING_ACTION})
    
        2
  •  5
  •   Matthew Frederick Duro Brown    7 年前

    这是redux可观察对象的外观:

    import { Observable } from 'rxjs/Observable';
    import 'rxjs/add/observable/zip';
    import 'rxjs/add/operator/map';
    import 'rxjs/add/operator/take';
    
    
    function doTheThing(action$) {
      return Observable
         // waits for all actions listed to complete
        .zip(action$.ofType(FIRST_ACTION).take(1), 
             action$.ofType(SECOND_ACTION).take(1),
         )
    
        // do the thing
        .map(() => ({ type: DO_THE_THING_ACTION }));
    }