redux可观测调度动作
我需要使用redux可观测调度动作,redux,redux-observable,Redux,Redux Observable,我需要使用redux observable以某种顺序分派一些操作,但是,它只需要分派最后一个操作。请参见示例: export const fetchClientsEpic = (action$, { dispatch }) => action$ .ofType(fetchClients) .mapTo(fetchClientsPending(true)) .mergeMap(() => { return ajax .getJSO
redux observable
以某种顺序分派一些操作,但是,它只需要分派最后一个操作。请参见示例:
export const fetchClientsEpic = (action$, { dispatch }) =>
action$
.ofType(fetchClients)
.mapTo(fetchClientsPending(true))
.mergeMap(() => {
return ajax
.getJSON('some/get/clients/api')
.map((clients: IClient[]) => {
return fetchClientsSuccess(
map(clients, (client, index) => ({
key: index,
...client,
})),
);
});
});
fetchclientssaccess
与客户端一起调度,但是fetchClientsPending
没有,我完全不明白为什么。我可以使用dispatch
,因为我在params中得到它,但我觉得这不是一个好的解决方案(?)。我想应该在溪流中完成。我从RxJs和redux observable开始。有可能吗 操作符是一系列的可观察对象,其中一个流的输入是另一个流的输出。因此,当您使用mapTo
时,您将一个动作映射到另一个动作。但是,您的mergeMap
映射了该挂起的操作,并将其映射到执行ajax之类操作的其他内部可观察对象,从而有效地丢弃了挂起的操作。因此,可以将RxJS视为一系列管道,数据在其中流动(流)
虽然没有什么灵丹妙药,但在这种特殊情况下,您可以通过在您的内部可观测数据末尾使用startWith
来实现您想要实现的目标
export const fetchClientsEpic = (action$, { dispatch }) =>
action$
.ofType(fetchClients)
.mergeMap(() => {
return ajax
.getJSON('some/get/clients/api')
.map((clients: IClient[]) => {
return fetchClientsSuccess(
map(clients, (client, index) => ({
key: index,
...client,
})),
);
})
.startWith(fetchClientsPending(true)); // <------- like so
});
也就是说,我建议不要同步调度另一个操作来设置抓取挂起的状态,而是依赖原始的
fetchClients
操作本身来实现相同的效果。还原程序应该假设,如果看到这样一个操作,那么无论如何开始抓取,都会有一些错误。这为您节省了样板文件,并对micro性能有所帮助,因为您不需要运行两次减速机、epics和rerender
不过没有规则,所以如果你对此有强烈的感觉,那么就去做吧:)我能够将它拆分成不同的史诗并创建新的操作:
const fetchClientsEpic=(action$)=>action$。of type(fetchClients)(fetchClients)。mergeMap(()=>[fetchclientexpensing(true),fetch())代码>挂起修改存储,并获取刚刚获取的数据并将其设置为srtore。但我仍然不确定它是否可以优化?谢谢你的澄清。我是否可以使用.concatAll()`after.mergeMap
而不是Observable.concat
(当然mergeMap
,本例返回的是Observable数组)?你推荐哪种方法?
export const fetchClientsEpic = (action$, { dispatch }) =>
action$
.ofType(fetchClients)
.mergeMap(() => {
return Observable.concat(
Observable.of(fetchClientsPending(true)),
ajax
.getJSON('some/get/clients/api')
.map((clients: IClient[]) => {
return fetchClientsSuccess(
map(clients, (client, index) => ({
key: index,
...client,
})),
);
})
);
});