如何合并两个可观察量并提前完成

2023-12-09

内置的行为Merge运算符完成时both来源已完成。我正在寻找这个运算符的一个变体,它产生一个可观察的结果,当any两个源可观察量的完成。例如,如果第一个可观察的成功完成并且later第二个可观察的结果有一个异常,我希望忽略这个异常。

我想出了一个实现,它将一个特殊的哨兵异常连接到两个可枚举值,然后合并的序列捕获并抑制该异常。我想知道我是否缺少一个更简单的解决方案。

/// <summary>
/// Merges elements from two observable sequences into a single observable sequence,
/// that completes as soon as any of the source observable sequences completes.
/// </summary>
public static IObservable<T> MergeUntilAnyCompletes<T>(this IObservable<T> first,
    IObservable<T> second)
{
    var sentinel = new Exception();
    first = first.Concat(Observable.Throw<T>(sentinel));
    second = second.Concat(Observable.Throw<T>(sentinel));
    // Concat: Concatenates the second observable sequence to the first
    // observable sequence upon successful termination of the first.
    return first.Merge(second)
        .Catch(handler: (Exception ex) =>
        ex == sentinel ? Observable.Empty<T>() : Observable.Throw<T>(ex));
    // Catch: Continues an observable sequence that is terminated by an exception
    // of the specified type with the observable sequence produced by the handler.
}

有趣的黑客:

public static IObservable<T> MergeUntilAnyCompletes<T>(this IObservable<T> first,
    IObservable<T> second)
{
    return Observable.Merge(
        first.Materialize(),
        second.Materialize()
    ).Dematerialize();
}

Materialize将可观察量转换为通知的可观察量,因此Merge将不再压制OnCompleted通知。当你Dematerialize,那么该操作员将看到OnCompleted并停止。

旁注:如果你想要一些有趣的、略带学术性的阅读Materialize/Dematerialize read 这篇博文。他正在写关于 Ix 的文章,但同样的事情也适用于 Rx。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何合并两个可观察量并提前完成 的相关文章

随机推荐

  • 在 glsl es 2.0、Gamemaker Studio 2.0 中获取渐变平方的问题

    我制作了一个包含 4 个三角形的三角形列表 中间点的颜色不同 然后目标是组合三角形以获得漂亮的渐变 但是三角形的边缘会产生不需要的线条 我不希望这些线条我希望它一直平滑 我怎样才能得到想要的结果 Images 着色器代码 Simple pa
  • 将tinyMCE与Angular 6一起使用,无需apikey(免费)

    我尝试使用 Angular 6 安装tinyMCE 我正在关注以下文档https www tiny cloud docs integrations angular2 一切正常 但我必须有一个 apiKey 才能使用tinyMCE 云 我收到
  • 在 data.table 中高效插入默认缺失行

    假设我有以下内容data table dt lt data table id c 1 1 1 1 1 1 2 2 2 2 wday c mon tue wed thu fri sat mon tue thu fri val c 2 3 5
  • 在 Heroku 上使用 Compass:/tmp 用于远程和本地样式表

    我目前正在使用 Compass 和 Heroku 使用这个配置Heroku 知识库上推荐 Heroku 有一个只读文件系统 因此编译后的样式表需要存储在 tmp 中 这在 Heroku 上远程运行得很好 然而 在本地 Rails 期望在 p
  • main 方法中的 ArrayIndexOutOfBounds 异常

    我收到数组绑定错误 但在我看来 数组从 0 开始 那么这段代码有什么问题呢 public class Quadratic public static void main String args double b Double parseDo
  • PHP 数组用键替换数字

    我有这个数组 Array result gt Success finals gt Array 0 gt Array id gt 633 name gt RESULT84 0 gt Array id gt 766 name gt RESULT
  • R + ggplot2 => 在方面饼图上添加标签[重复]

    这个问题在这里已经有答案了 我想在多面饼图上添加数据标签 也许有人可以帮助我 我的数据 year lt c 1 2 1 2 1 2 prod lt c 1 1 2 2 3 3 quantity lt c 33 50 33 25 34 25
  • 如何知道php脚本是否通过require_once()被调用? [复制]

    这个问题在这里已经有答案了 我的网络应用程序有很多模块 每个模块都有一个 主 php 脚本 该脚本根据发送到主模块的查询加载子模块 file clientes php check for valid user import CSS and
  • 如何使用 Mac OS X 终端将目录中最旧或最新的文件移动到另一个目录

    我正在 Mac OSX 10 6 终端上尝试使用以下命令 但它不起作用 知道我可能做错了什么吗 这些工作 列出最近的文件 ls l t head 2 列出最旧的文件 ls gt tail 1 但当我尝试移动最旧的文件 这样它就不起作用 mv
  • MVC 页面首次查看速度缓慢

    我有一个简单的应用程序 其中包含 MVC 页面 除了 HTML 和 Razor C 代码 不多 之外 没有 javascript 图像或任何其他内容 在我看来 当页面第一次加载时 它们需要很长时间 然后加载速度就会快得多 第一次请求页面时
  • 使用 Ruby 从 CDIP 数据创建光谱热图或强度图

    背景 根据沿海信息数据计划 CDIP 他们正在生成波涌的光谱热 强度图 这是通过包含能量密度 持续时间 以秒为单位 和方向 以度为单位 180 度代表南 的数据动态生成的 数据样本 下面是对数据的解释 http cdip ucsd edu
  • 可以并行安装同一版本 Visual Studio 的多个套件吗?

    我想知道是否可以在同一台计算机上安装 Visual Studio 2008 Pro 和 Visual Studio 2008 standard 我尝试在express之后安装pro MSDN上提供的试用版 似乎要求它们安装在同一目录中 这是
  • 在不关闭键盘的情况下在文本字段之间切换时 Xcode 约束中断

    这几天我一直在与 Xcode 中的一个问题作斗争 但我不知道出了什么问题 我创建了一个带有三个独立文本字段的简单 UIViewcontroller 当我在模拟器或物理设备上运行应用程序时 当我点击文本字段时 我会在控制台中收到此警告 仅当我
  • 如何对 spring security @PreAuthorize 自定义表达式进行单元测试

    PostMapping ResponseStatus HttpStatus CREATED PreAuthorize messageSecurityService isAuthorized userAuthentication public
  • C/C++:将 char 中的十六进制值转换为整数

    我将十六进制值存储为字符 char A 0 char B 6 char C E 我需要将它们转换为整数 我知道 atoi 但这仅适用于十进制编码的字符值 有类似的功能吗 int v A gt 9 A 0x20 A 10 A 0 对于 ASC
  • 使用 JavaScript 验证电话号码

    我在一些网站上找到了这段代码 它运行得很好 它验证电话号码是否采用以下格式之一 123 456 7890 or 123 456 7890 问题是我的客户 我不知道为什么 也许是客户的东西 想要添加另一种格式 连续的十个数字 如下所示 123
  • 将鼠标悬停在 Chartjs 饼图上时画布填充文本消失

    我正在使用来自 Chartjs 的圆环图 并在画布的中心填充两行文本 这些在初始动画后显示得很好 但是当我将鼠标悬停在甜甜圈上时 会显示相关元素的工具提示 这是预期的 但填充文本消失 发生这种情况的任何原因以及我该如何纠正它 这是我用来在画
  • AngularJS 中的视图未更新

    在事件回调中更新模型时更新模型属性对视图没有影响 有解决这个问题的想法吗 这是我的服务 angular service Channel function var channel null return init function chann
  • 最佳实践 - 警告:方法缺少“等待”操作员警告

    是的 我知道还有其他问题涉及此警告的含义以及如何解决它 但是 我对异步编程的最佳实践有疑问 我有一个服务层 用于处理数据层和表示层之间的数据传输 该服务包含多个查询数据库并返回结果的方法 我一直在尝试尽可能使用异步编程 一个例子 publi
  • 如何合并两个可观察量并提前完成

    内置的行为Merge运算符完成时both来源已完成 我正在寻找这个运算符的一个变体 它产生一个可观察的结果 当any两个源可观察量的完成 例如 如果第一个可观察的成功完成并且later第二个可观察的结果有一个异常 我希望忽略这个异常 我想出