redux-observable返回多个动作类型

时间:2017-05-02 22:51:35

标签: redux-observable

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

  1. 当'APPLY_SHOPPING_LIST'的动作类型在调度'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);
    

    返回concatList;

  2. 现在问题是只有'APPLYING_SHOPPING_LISTS'被触发,'APPLIED_SHOPPING_LISTS'根本不会被激活到reducer。我在这里错过了什么吗?

    只是为了补充一点,当我使用flatMap时它起作用,下面给出的是代码

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

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

1 个答案:

答案 0 :(得分:3)

有几个问题。由于Observable是懒惰的,因此action$.ofType('APPLY_SHOPPING_LISTS')之后applyingShoppingListSourceOther的第二个applyingShoppingListSource在第一个APPLY_SHOPPING_LISTS之后被连接,因此在第一个APPLY_SHOPPING_LISTS之后它将不会正在监听APPLYING_SHOPPING_LISTS已经完成,但它永远不会现实完成,因为你正在采取所有匹配的动作。

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

  • 开始收听APPLY_SHOPPING_LISTS,并在收到时将其映射到APPLIED_SHOPPING_LISTS
  • 当第一个Observable完成(它从未这样做)时,再次开始侦听.take(1),这次收到时将其映射到.first(),但在发出之前等待5000毫秒。

你可以通过使用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,但您可能希望使用drawRect()取消尚未发出的任何先前待处理的drawRect(float left, float top, float right, float bottom, Paint paint) 。你的电话。