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,
              })),
            );
          })
      );
    });