我正在使用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);
返回concatList;
现在问题是只有'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' });
我很困惑这是如何工作而另一个不是?
答案 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
.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)
。你的电话。