redux-observable史诗,不发送任何新动作

Ben*_*Ben 3 action promise rxjs redux-observable

可能是我是一个菜鸟,并没有完全理解这些东西应该如何工作,但我有一个在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();
 });
Run Code Online (Sandbox Code Playgroud)

jay*_*lps 10

您可以使用.ignoreElements()RxJS运算符从可观察链中丢弃任何next'd值

action$.ofType(type)
  .do(() => resolve())
  .ignoreElements();
Run Code Online (Sandbox Code Playgroud)

另一种方法(不再是对或错)是创建一个只能订阅的匿名Observable.

const waitForResultEpic = action$ => new Observable(observer =>
  action$.ofType(type)
    .subscribe(() => resolve())
);
Run Code Online (Sandbox Code Playgroud)

这隐式返回我们创建的订阅,因此它也附加到rootEpic的生命周期.因为我们从不打电话observer.next(),这部史诗永远不会发出任何价值; 就像ignoreElements().


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

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

const waitForResult = action$ =>
  action$.ofType(type)
    .take(1)
    .do(() => resolve())
    .ignoreElements();
Run Code Online (Sandbox Code Playgroud)

要么

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

这将仅在应用程序的整个生命周期中匹配一次 - 一旦收到它将永远不会再次执行.