当前位置: 首页 > 知识库问答 >
问题:

我的“zipLatest”操作符是否已经存在?

郎飞航
2023-03-14

关于我为自己写的一个操作员的快速问题。

请原谅我可怜的男人的大理石图:

zip
aa--bb--cc--dd--ee--ff--------gg
--11----22--33--------44--55----
================================
--a1----b2--c3--------d4--e5----

combineLatest
aa--bb--cc--dd--ee--ff--------gg
--11----22--33--------44--55----
================================
--a1b1--c2--d3--e3--f3f4--f5--g5

zipLatest
aa--bb--cc--dd--ee--ff--------gg
--11----22--33--------44--55----
================================
--a1----c2--d3--------f4------g5

zipLatest(我写的那个)与zip几乎同时触发,但没有排队zip包含。

我已经实现了它,我只是想知道它是否已经存在。我知道我以前写过一个类似的方法,偶然发现我在不知情的情况下编写了示例操作符

那么,这是否已经存在于框架中,或者作为我没有想到的元素的一个微不足道的组成部分存在?

注意:我不想依赖输入的相等性来消除重复数据(a ladistinctUntilChanged)。它应该与仅在一个间隔上输出“a”的信号一起工作。

共有2个答案

廉志强
2023-03-14

虽然您特别提到不要使用DistinctUntilChanged,但您可以将其与计数器一起使用,以获得不同的新值:

public static IObservable<(T, TSecond)> ZipLatest<T, TSecond>(this IObservable<T> source, IObservable<TSecond> second)
{
    return source.Select((value, id) => (value, id))
        .CombineLatest(second.Select((value, id) => (value, id)), ValueTuple.Create)
        .DistinctUntilChanged(x => (x.Item1.id, x.Item2.id), new AnyEqualityComparer<int, int>())
        .Select(x => (x.Item1.value, x.Item2.value));
}

public class AnyEqualityComparer<T1, T2> : IEqualityComparer<(T1 a, T2 b)>
{
    public bool Equals((T1 a, T2 b) x, (T1 a, T2 b) y) => Equals(x.a, y.a) || Equals(x.b, y.b);
    public int GetHashCode((T1 a, T2 b) obj) => throw new NotSupportedException();
}

请注意,我在这里使用了Int32,因为这是Select()提供给我的,但对于某些用例来说,它可能太小了。Int64或Guid可能是更好的选择。

壤驷旭
2023-03-14

对这个问题进行更新:RxJS 6中仍然没有包含此要求的操作员,并且似乎没有计划在将来的版本中使用。也没有提出此运算符的打开拉取请求。

正如这里所建议的,组合使用组合测试、第一次和重复将产生预期的行为:

combineLatest(obs1, obs2).pipe(first()).pipe(repeat());

组合测试(CombineTest)将等待两个可见光的发射-丢弃除最新发射外的所有发射first将在发射后完成可观测值,并在CombineTest上重新订阅,使其再次等待两个可观测值的最新值。

重复的重新订阅行为没有完整记录,但可以在GitHub源代码中找到:

source.subscribe(this._unsubscribeAndRecycle());

 类似资料:
  • 问题内容: 我正在做一些性能分析,我想知道,当数据类型已知(双精度)时,是否将其标准数组操作向量化。 编辑:此操作是否被向量化,即计算将包含SIMD运算吗? 问题答案: 对,他们是。 链接:github上的Numpy simd.inc.src。

  • 本文向大家介绍golang判断net.Conn 是否已关闭的操作,包括了golang判断net.Conn 是否已关闭的操作的使用技巧和注意事项,需要的朋友参考一下 在多线程的线程里边,用一个线程处理一条连接,如何判断连接已经关闭? 试了一下,如果连接中断,读写会出现这种net.OpError,这个就可以判断是否断开 但是我也不确定有没有更好的方法?如果有的话,希望朋友们不吝赐教 补充:Go --

  • 问题内容: 我正在做一个拼字游戏程序 在下面的示例中,我下面的代码使用SQLite作为简单数据库来存储我的单词。 但是,它告诉我无法重新创建数据库表。 如何检查是否已经存在一个名为的表,然后跳过尝试创建表的操作? 错误: 编码: 问题答案: 您要查找的查询是: 因此,代码应如下所示: SQLite 3.3+的一个方便的替代方法是使用更智能的查询来创建表: 从文档中: 试图在已经包含相同名称的表,索

  • 基本上,我想写这样的代码: 这是不可能的,因为没有重载 因此,我目前正在使用,但它并不完美。 有没有一种方法可以不重新声明函数就知道函数是否存在? 基本上,我想做一些类似的事情 和主要的:

  • 如果文档ID不存在,我想将数据添加到firestore数据库中。到目前为止,我一直在尝试: 目标是检查数据库中的所有文档ID,并查看与“varuId”变量的任何匹配。如果匹配,则不会创建文档。如果不匹配,它应该创建一个新文档

  • exists key 返回1表示存在,0不存在