You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何像Angular一样在Blazor Fluxor Effects中集成Observables

在Fluxor中使用Observable实现类似NGRX的exhaustMap效果

首先明确:Fluxor底层确实基于Rx.NET实现数据流处理,所以完全支持在Effects中使用Observable替代Task,实现你需要的「忽略重复请求直到当前请求完成」的逻辑。

你之前的认知有误——Fluxor的Effect方法并非只能返回Task,它还支持返回IObservable<IAction>,这正是整合Rx操作符的关键。

实现步骤与代码示例

  1. 依赖确认:确保项目已引用Fluxor(默认依赖Rx.NET,一般无需额外安装System.Reactive,若缺失可通过NuGet添加)。

  2. 重写Effect方法:将原异步Task方法改为返回IObservable<IAction>,利用Rx.NET的Exhaust操作符(对应RxJS的exhaustMap)实现核心逻辑:

using System.Reactive.Linq;
using Fluxor;

public class AnimalsEffects(IState<AnimalsState> state, IGqlClient client)
{
    [EffectMethod]
    public IObservable<IAction> OnGetAnimals(IObservable<GetAnimals> actions)
    {
        return actions
            // 可选:额外过滤无需重复请求的场景(比如数据已加载或正在加载)
            .Where(_ => !state.Value.IsLoading && state.Value.Animals == null)
            // 核心:当前请求未完成时,忽略后续的GetAnimals动作
            .Exhaust(action => 
                // 将异步HTTP请求转换为Observable
                Observable.FromAsync(() => client.GetAnimals.ExecuteAsync())
                    // 映射为成功动作
                    .Select(queryResult => new GetAnimalsSuccess(queryResult.Data!))
                    // 捕获错误并映射为失败动作
                    .Catch((Exception ex) => Observable.Return(new GetAnimalsFailure(ex.Message)))
            );
    }
}

代码说明

  • 参数变化:Effect方法接收IObservable<GetAnimals>而非单个Action和Dispatcher,Fluxor会自动将同类型的Action以流的形式传递过来。
  • Exhaust操作符:当源Observable(GetAnimals动作流)发射新值时,若当前内部Observable(HTTP请求流)未完成,则忽略新值,直到当前请求结束,完美匹配你需要的避免重复请求的需求。
  • Observable.FromAsync:将异步Task转换为Observable,让你能使用Rx的所有操作符处理数据流。
  • 状态过滤:通过Where操作符可额外判断状态(如是否正在加载、数据是否已存在),进一步减少不必要的请求。

对比原实现的优势

原Task方式每次触发GetAnimals动作都会发起新请求,即使前一个请求还在进行;而Observable+Exhaust的方式会自动忽略后续重复请求,直到当前请求完成,完全复刻了你在NGRX中用exhaustMap实现的逻辑。

内容的提问来源于stack exchange,提问作者baouss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:14:56