redux-observable return 多种动作类型
redux-observable return multiple action types
我正在使用 redux-observable,这就是我想要做的。
当 '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
。你来电。
我正在使用 redux-observable,这就是我想要做的。
当 '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
。你来电。