redux-observable return 多种动作类型

redux-observable return multiple action types

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

    return concatList;

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

我很困惑这个是怎么工作的,而另一个不是?

有几个问题。由于 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()(同样的事情)来解决第一个未完成的特定问题,但您通常需要将 epics 写成 not ever停止倾听,让他们随时响应行动。

我想你想要的是这个:

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。你来电。