- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我要演示的(过度)简化版本:
var reactiveCommandA = ReactiveCommand.CreateAsyncTask(_ => CanPossiblyThrowAsync());
reactiveCommandA.ThrownExceptions
.Subscribe(ex => UserError.Throw("Oh no A", ex));
var reactiveCommandB = ReactiveCommand.CreateAsyncTask(_ => CanAlsoPossiblyThrowAsync());
reactiveCommandB.ThrownExceptions
.Subscribe(ex => UserError.Throw("Oh no B", ex));
var reactiveCommandC = ReactiveCommand.CreateAsyncTask
(
async _ =>
{
await reactiveCommandA.ExecuteAsync(); // <= Could throw here
await reactiveCommandB.ExecuteAsync();
DoSomethingElse();
}
);
reactiveCommandC.ThrownExceptions
.Subscribe(ex => UserError.Throw("Oh no C", ex));
假设我的后台实现是 reactiveCommandA
可能会抛出异常。没关系,因为我已经订阅了 .ThrownExceptions
理论上会通知用户并重试/失败/中止(为简洁起见,此处未显示)。所以它不会冒泡到调度员。
所以当 reactiveCommandA
时这很棒是自己执行的。但是,我有 reactiveCommandC
执行 reactiveCommandA
和 reactiveCommandB
.我也订阅了它的.ThrownExceptions
.我遇到的问题是,如果我执行 reactiveCommandC
和 reactiveCommandA
实现在其中抛出,它也会导致 reactiveCommandC
去炸掉。然后我两次通知用户相同的根错误,因为 reactiveCommandA
做它的.ThrownExceptions
事情,然后 reactiveCommandC
做它的.ThrownExceptions
那么对于这种情况有标准的方法吗?最好是有点优雅的东西,因为我发现现有代码相当干净,我不想把事情搞得一团糟或引入意大利面条。
我想到的事情:
用 try/catch
包围“await...”行阻止并吞咽异常并退出。如果我必须经常这样做,那就太丑了。
使用 await reactiveCommandA.ExecuteAsync().Catch(Observable.Never<Unit>());
尽管我认为这会导致 reactiveCommandC 永远无法完成,因此它永远无法再次执行。
使用与 .Catch()
相同的方法方法,但根据我是否成功通过返回一个 bool 值(例如 .Catch(Observable.Return(false))
。仍然需要检查我们是否可以在每个 await
语句之间继续。
这里有什么更巧妙的事情吗?谢谢。
最佳答案
嗯,这是 ReactiveCommand 设计的一个方面,有点糟糕(披露:我可以说它很糟糕,我写了它!)这是修复它的懒惰方法:
Observable.Merge(rxCmdA.ThrownExceptions, rxCmdB.ThrownExceptions, rxCmdC.ThrownExceptions)
.Throttle(TimeSpan.FromMilliseconds(250), RxApp.MainThreadScheduler)
.Subscribe(ex => UserError.Throw("Oh no C", ex));
在未来我肯定想修复一些这样的双重抛出问题,以及一些关于 RxCmd 设计的其他问题。
关于c# - 执行劣质 ReactiveCommand 时,ReactiveUI 处理异常的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26219105/
我已经看到一些关于使用 Observables 而不是带有 async/await 的任务的讨论。我目前几乎只使用 CreateFromTask。我一直在试图理解使用 CreateFromObserv
我有一个使用 ReactiveCommand 的 View 模型: public ReactiveCommand Command { get; } public MyViewModel() {
我正在努力处理一个 ReactiveUI 用例,我觉得它非常简单,必须有“开箱即用”的支持。但是我找不到它。 该场景是具有以下功能的基本搜索界面: 用户在其中输入搜索文本的搜索字符串文本框 显示结果的
我想用command实现textbox的KeyDown事件, 我想让命令可以识别KeyDown事件中的KeyEventArgs之类的键输入并做一些其他事情, 所以我想将命令参数传递给 Reactive
我正在使用 System.Windows.Interactivity 绑定(bind)一个 LoadedCommand,如下所示: 在我的 View 模型中,
我对 ReactiveCommand 处理 ObserveOn 和 SubscribeOn 的方式有疑问。 我有一个返回可观察的字符串序列的 API,它看起来像这样: public IObserva
当执行绑定(bind)到控件的 ReactiveCommand 时,我想将一个参数从我的 View 传递给我的 ViewModel。参数的类型应为 IJcUser 所以我这样定义命令: public
我想在命令执行之前设置忙标志和状态栏文本,并在它完成之后——重置标志和文本。我的工作代码在这里: Cmd = ReactiveCommand.Create(); Cmd.Subscribe(async
我知道如何处理 ReactiveCommand 调用的异步任务抛出的异常但是如何处理任务返回前抛出的异常? 在下面的例子中ThrowAndHandle命令将在执行时从异步任务中抛出异常,并将处理该异常
我有一个基本的 ReactiveCommand。没有异步魔法,只有普通的 ReactiveCommand.Create()。我 Subscribe() 的重载采用异常处理程序,但从未在所述异常处理程序
我订阅了一个命令的 IsExecuting: LoginCommand.IsExecuting.Subscribe(x => Log("Logging in")); 当我的 Command 被 Inv
我有这个 ReactiveCommand; LoadFileCommand = ReactiveCommand.CreateAsyncTask((_, cancellationToken) => Lo
我从一个冷的可观察对象创建了一个 react 命令。调用命令时,它会将 IsExecuting 更改为 true,并将 first emitted value 从 observable 更改回 fal
考虑在 ReactiveUI 中使用继承。我有带有 DoSomethingCommand 的 ViewModel 基类。此命令的“CanExecute”取决于属性 Prop1 public class
我刚刚开始使用 ReactiveUI。我有以下类(class): public class MainViewModel : ReactiveObject, IRoutableViewModel {
我熟悉 MVVM 的概念并使用过 MvvmCross,但我正在尝试 ReactiveUI 并尝试围绕一些概念进行思考。 我正在 WPF 中编写一个工具(可能分支到其他框架)供设计人员创建和编辑数据文件
我的 xaml ( 在此示例中仅显示 2 ) 中有几个 Tiles (TileLayoutControl Class),其可见性绑定(bind)到 bool 属性并通过 BooleanToVisibi
我想知道绑定(bind)到 ReactiveCommand 的 IsExecuting 的推荐方式. 问题是初始命令执行(在构造函数末尾开始)没有使用 IsLoading 更新 WPF 控件。作为绑定
我正在使用 ReactiveUI与 AvaloniaUI并且有一个带有多个 ReactiveCommands 的 ViewModel即扫描、加载和运行。 当 Observable 时调用扫描已更新(当
我缺乏经验,尤其是在 MVVM 方面,但尝试使用 ReactiveUI,并且我不理解我发现的演示 ReactiveCommand 的示例。我以前使用过 ICommand/DelegateCommand
我是一名优秀的程序员,十分优秀!