How to add quot;reloadquot; and IsLoading status to 2nd level Observable(如何将重新加载和IsLoding状态添加到二级可见对象)
问题描述
我觉得我在试着重新发明轮子,所以我最好问问。
已给定
- 我有一个
Observable<T> source - 和
Task LoadAsync<T>(T value)方法
时间
我使用选择/切换模式在源发出时调用LoadMethod
observable .Select(value => Observable.FromAsync(cancellationToken => LoadAsync(value, cancellationToken))) .Switch() .Subscribe();
然后
- 如何添加重新加载功能?
- 如何报告IsLoding状态:
LoadAsync是否正在运行 source完成时如何取消LoadAsync
我想创建一些可重用的方法或类,以实现对#1和#2的回答。
我到目前为止:https://dotnetfiddle.net/0zPhBE
public class ReactiveLoader<T> : IDisposable
{
private readonly BehaviorSubject<bool> _isLoading = new(false);
private readonly Subject<Unit> _completes = new();
private readonly Subject<T> _reloads = new Subject<T>();
private readonly IDisposable _subscription;
public bool IsLoading => _isLoading.Value;
public IObservable<bool> IsLoadingObservable => _isLoading.Skip(1).DistinctUntilChanged(); //Not nice
public ReactiveLoader(IObservable<T> observable, Func<T, CancellationToken, Task> handler)
{
_subscription = observable
.Finally(() => //Not nice
{
_completes.OnNext(Unit.Default);
})
.Merge(_reloads)
.Do(_ => _isLoading.OnNext(true))
.Select(value => Observable.FromAsync(cancellationToken => handler(value, cancellationToken)))
.Switch()
.Do(_ => _isLoading.OnNext(false))
.TakeUntil(_completes) //cancels loading when observable completes
.Subscribe();
}
public void Reload()
{
_reloads.OnNext(??); //needs last value of source
}
public void Dispose()
{
_completes.OnNext(Unit.Default);
_subscription.Dispose();
}
}
推荐答案
以下是一种方法:
IObservable<bool> sequence = source.Publish(published => published
.CombineLatest(_reloads, (x, _) => x)
.Select(x => Observable.FromAsync(ct => LoadAsync(x, ct)).Select(_ => false).Prepend(true))
.Switch()
.Do(_isLoading)
.TakeUntil(published.LastOrDefaultAsync()));
CombineLatest运算符将在_reloads每次发出信号时重新发出最新的值。
.Select(_ => false).Prepend(true)将内部可观测对象从IObservable<Unit>转换为IObservable<bool>,从而发出加载状态信号。
TakeUntil(published.LastOrDefaultAsync())将在source终止时立即终止序列(不等待任何挂起的LoadAsync操作)。
这篇关于如何将重新加载和IsLoding状态添加到二级可见对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何将重新加载和IsLoding状态添加到二级可见对象
基础教程推荐
- 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
- 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
- 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
- JSON.NET 中基于属性的类型解析 2022-01-01
- 如何动态获取文本框中datagridview列的总和 2022-01-01
- 全局 ASAX - 获取服务器名称 2022-01-01
- 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01
- 首先创建代码,多对多,关联表中的附加字段 2022-01-01
- 错误“此流不支持搜索操作"在 C# 中 2022-01-01
- 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
