【问题标题】:redux-observable return multiple action typesredux-observable 返回多种动作类型
【发布时间】:2017-05-04 01:07:19
【问题描述】:

我正在使用 redux-observable,这就是我想要做的。

  1. 当 'APPLY_SHOPPING_LIST' 的 actiontype 进入调度 'APPLYING_SHOPPING_LIST' 并在 5 秒后调度 'APPLIED_SHOPPING_LIST'。这是我目前想出的代码

    const applyingShoppingListSource = action$.ofType('APPLY_SHOPPING_LISTS').mapTo({ type: 'APPLYING_SHOPPING_LISTS' });
    
    const applyingShoppingListSourceOther = action$.ofType('APPLY_SHOPPING_LISTS').mapTo({ type: 'APPLIED_SHOPPING_LISTS' }).delay(5000);
    
    const concatList = applyingShoppingListSource.concat(applyingShoppingListSourceOther);
    

    返回连接列表;

现在的问题是只有 'APPLYING_SHOPPING_LISTS' 被触发,'APPLIED_SHOPPING_LISTS' 根本没有被触发到减速器。我在这里遗漏了什么吗?

补充一点,当我使用 flatMap 时,它可以工作,下面给出的是代码

 return action$.ofType('APPLY_SHOPPING_LISTS')
        .flatMap(() => Observable.concat(Observable.of({ type: 'APPLYING_SHOPPING_LISTS' }), Observable.of({ type: 'APPLYING_SHOPPING_LISTS' });

我很困惑这是如何工作的,而另一个则不是?

【问题讨论】:

    标签: redux-observable


    【解决方案1】:

    有几个问题。由于 Observables 是惰性的,因此您的第二个 action$.ofType('APPLY_SHOPPING_LISTS') for applyingShoppingListSourceOther 在第一个 applyingShoppingListSource 之后被连接,因此在第一个完成之前它不会监听 APPLY_SHOPPING_LISTS,但它永远不会实际完成,因为您正在采取所有匹配的操作,永远。

    换句话说,你的代码是这样做的:

    • 开始收听APPLY_SHOPPING_LISTS,收到后将其映射到APPLYING_SHOPPING_LISTS
    • 当第一个 Observable 完成时(它永远不会)再次开始监听 APPLY_SHOPPING_LISTS,这一次当接收到时将其映射到 APPLIED_SHOPPING_LISTS,但在发出它之前等待 5000 毫秒。

    您可以通过使用 .take(1).first()(同样的事情)来解决第一个未完成的特定问题,但您通常需要编写史诗以永不停止聆听,以便他们随时响应操作.

    我想你想要的是这样的:

    const exampleEpic = action$ =>
      action$.ofType('APPLY_SHOPPING_LISTS')
        .mergeMap(() =>
          Observable.of({ type: 'APPLYING_SHOPPING_LISTS' })
            .concat(
              Observable.of({ type: 'APPLIED_SHOPPING_LISTS' })
                .delay(5000)
            )
        );
    

    我使用了mergeMap,但您可能希望使用switchMap 取消任何尚未发出的先前待处理的APPLIED_SHOPPING_LISTS。您的来电。

    【讨论】:

    • 谢谢你,这确实有效,但只是为了澄清一下,你所说的第一个 Observable 永远不会完成是什么意思,我是否必须明确完成它,我虽然第一个语句 .mapTo 自动完成是吗?
    • redux-observable 提供给你的动作流代表了你的应用程序可能调度的每一个可能的动作——并且由于 redux 应用程序不会通常终止,该流永远不会自然完成。因此,当您说将操作 X 映射到 Y 时,它会一直这样做,直到源又名 action$ 完成。在大多数应用程序中,每个收到的 X 都将无限期地映射到 Y。如果您添加了.take(1),则意味着只取第一个看到的 X 并将其映射到 Y,然后完成。
    • 我说“大多数应用程序”是因为在某些服务器端渲染情况下,您实际上可能会“停止”您的动作流以表示结束,但我不经常看到这种情况——我只是讨厌说绝对。
    • 顺便说一句,这真的不是 redux-observable 的东西,这是 Observables——随着时间的推移,它们是一个 0、1 或更多值的流。所以有些 Observable 永远不会发出任何东西,有些会发出一件事并完成,有些会发出很多东西但永远不会完成,等等。 Epics 订阅了在您的应用程序中调度的所有操作的流。他们是“流程管理者”,在您的应用程序的整个生命周期中都在倾听。
    猜你喜欢
    • 2016-09-09
    • 2021-04-13
    • 2017-10-07
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多