0

我正在使用 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);
    

    返回连接列表;

现在的问题是只有 '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' });

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

4

1 回答 1

4

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

换句话说,您的代码执行此操作:

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

.take(1)您可以通过使用or (相同的东西)来解决第一个未完成的特定问题.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发出的先前挂起。你的来电。

于 2017-05-03T17:07:19.507 回答