promise - 不发送任何新 Action 的 redux-observable 史诗

标签 promise action rxjs redux-observable

可能是我是一个菜鸟,还没有完全理解这些东西应该如何工作,但是我在 redux-observable 中有一个史诗,我想用它作为一种方式来创建一个 promise ,它将调度一个 Action 并等待一个解决之前的不同操作。我通过将操作映射到 '__IGNORE__' 来使其工作但我真的不想那样做。有没有办法让史诗处理一个 Action ,而不传递其他任何东西?

这是我的代码:

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

   action();
 });

最佳答案

您可以使用 .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 匹配的传入 Action 。多变的。这可能不是您想要的,如果您想匹配一次然后完成。

您可以使用 .take(1) 来实现这一点。运算符(operator)。

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()
    })
);

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

关于promise - 不发送任何新 Action 的 redux-observable 史诗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40408041/

相关文章:

javascript - ionic : ERESOLVE could not resolve: Found: rxjs@7. x.x

javascript - 如何在 .then() 链中访问之前的 promise 结果?

javascript - 导出链式 promise 的返回值

java - JList 从新列表中清除以前的条目

ios - RxSwift,将 Action 绑定(bind)到 UIButton 在 View 转换后停止生成事件

Angular/Rxjs 条件嵌套 Observables

javascript - 递归、Node js 和异步调用

javascript - 基于 Promise 的属性 Ember

javascript - 应该在 Controller 上定义关闭 Action

javascript - 如何在嵌套对象数组中获取 RxJs Observable 的值来解析?