【问题标题】:redux-observable epic that doesn't send any new actions不发送任何新动作的 redux-observable 史诗
【发布时间】:2017-03-17 10:10:17
【问题描述】:

可能是因为我是一个菜鸟,还没有完全理解这些东西应该如何工作,但是我有一个 redux-observable 的史诗,我想用它作为一种方式来创建一个承诺,它将调度一个动作和在解决之前等待不同的操作。我已经通过将操作映射到'__IGNORE__' 来实现它,但我真的不想这样做。有什么方法可以让史诗般的动作处理,而不传递其他任何东西?

这是我的代码:

export const waitFor = (type, action) => new Promise((resolve, reject) => {
   const waitForResult = action$ => action$.ofType(type).do(() => resolve()).mapTo({type: "___IGNORE___"});
   registerEpic(waitForResult);

   action();
 });

【问题讨论】:

    标签: promise action rxjs redux-observable


    【解决方案1】:

    您可以使用.ignoreElements() RxJS 运算符从可观察链中丢弃任何下一个值

    action$.ofType(type)
      .do(() => resolve())
      .ignoreElements();
    

    另一种方法(没有更多对错)是创建一个只订阅的匿名 Observable。

    const waitForResultEpic = action$ => new Observable(observer =>
      action$.ofType(type)
        .subscribe(() => resolve())
    );
    

    这是隐式返回我们创建的订阅,因此它也附加到我们的 rootEpic 的生命周期。因为我们从不调用observer.next(),所以这个史诗从不发出任何值;就像ignoreElements()


    尽管您没有询问,但您最终可能会注意到您的史诗将永远运行,并监听与 type 变量匹配的传入动作。这可能不是你想要的,如果你想匹配一次然后完成。

    您可以使用.take(1) 运算符来完成此操作。

    const waitForResult = action$ =>
      action$.ofType(type)
        .take(1)
        .do(() => resolve())
        .ignoreElements();
    

    或者

    const waitForResult = action$ => new Observable(observer =>
      action$.ofType(type)
        .take(1)
        .subscribe({
          next: () => resolve(),
          error: err => observer.error(err),
          complete: () => observer.complete()
        })
    );
    

    这只会在应用程序的生命周期内匹配一次——一旦收到就不会再匹配了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2019-01-23
      • 2017-04-22
      • 1970-01-01
      • 2020-12-30
      相关资源
      最近更新 更多