gpt4 book ai didi

redux - 使用 Redux Observable 等待操作序列

转载 作者:行者123 更新时间:2023-12-02 23:22:11 25 4
gpt4 key购买 nike

我有一个用例,在使用 Redux Observables 调度另一个操作之前,我需要等待一系列操作。我见过一些类似的问题,但我无法理解如何在给定的用例中使用这些方法。

本质上我想做这样的事情:

action$
.ofType(PAGINATION_CLICKED) // This action occurred.
.ofType(FETCH_SUCCESS) // Then this action occurred after.
.map(() => analyticsAction()); // Dispatch analytics.

例如,如果触发 FETCH_ERROR 类型的另一个操作,我还想取消并重新开始该序列。

最佳答案

很好的问题。重要的一点是,action$ 是所有操作在调度时的热/多播流(它是一个主题)。由于天气很热,我们可以多次组合它,它们都会听到相同的操作流。

// uses switchMap so if another PAGINATION_CLICKED comes in
// before FETCH_SUCCESS we start over

action$
.ofType(PAGINATION_CLICKED)
.switchMap(() =>
action$.ofType(FETCH_SUCCESS)
.take(1) // <-------------------- very important!
.map(() => analyticsAction())
.takeUntil(action$.ofType(FETCH_ERROR))
);

因此,每次我们收到 PAGINATION_CLICKED 时,我们都会开始监听内部 Observable 链,该链监听单个 FETCH_SUCCESS。拥有 .take(1) 非常重要,否则我们会继续监听多个 FETCH_SUCCESS,这可能会导致奇怪的错误,即使不是通常也是最好的练习只拿你需要的东西。

如果我们首先收到 FETCH_ERROR,我们会使用 takeUntil 取消等待 FETCH_SUCCESS

<小时/>

作为奖励,如果您决定也希望根据错误进行一些分析,不仅可以重新开始,您还可以使用 race 在两个流之间进行真正的竞争。第一个发出的为胜;另一个已取消订阅。

action$
.ofType(PAGINATION_CLICKED)
.switchMap(() =>
Observable.race(
action$.ofType(FETCH_SUCCESS)
.take(1)
.map(() => analyticsAction()),
action$.ofType(FETCH_ERROR)
.take(1)
.map(() => someOtherAnalyticsAction())
)
);

这是同样的事情,但使用 race 作为实例运算符而不是静态运算符。这是您可以选择的风格偏好。他们都做同样的事情。使用您更清楚的一种。

action$
.ofType(PAGINATION_CLICKED)
.switchMap(() =>
action$.ofType(FETCH_SUCCESS)
.map(() => analyticsAction())
.race(
action$.ofType(FETCH_ERROR)
.map(() => someOtherAnalyticsAction())
)
.take(1)
);

关于redux - 使用 Redux Observable 等待操作序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45546401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com