【问题标题】:Understanding RxJS's Flatmap, FlatmapLatest in C# terms理解RxJS的Flatmap,C#术语中的FlatmapLatest
【发布时间】:2015-10-20 21:19:21
【问题描述】:

我主要是 C# 开发人员,在 JavaScript 中扩展了我的视野,最近偶然发现了一个名为 RxJS 的库。

我想了解MapFlatmapFlatmapLatest 之间的关系以及 C#.Net 中是否有任何等价物?

【问题讨论】:

  • 嗨 xgrommx,这是我最初用来学习的链接,但我不明白我怎么能与 c# 表示法联系起来?由于我不是高级 javascript 开发人员,因此了解等效的 c# 函数和用法将帮助我快速过渡。
  • 注意:正如我所提到的,我是 RxJS 的初学者,所以我的回答有助于我自己理解这些功能...... :-) 但我对 C# 一无所知,所以我不能给出你等价物。但是有很多关于 ReactiveX for C# 的文章,如果他们可以帮助你的话。至少,我希望我向你展示了如何在纯 JS 中使用它。
  • 来自@ReactiveX 的官方 C# 答案(应该直接在这里回答!;-)):twitter.com/ReactiveX/status/657174664855330816 "flatMap == SelectMany 和 flatMapLatest == SelectMany().Switch()"

标签: javascript c# .net rxjs


【解决方案1】:

RxJS 是 Reactive Extensions 系列的一部分,它以各种语言实现,包括 C#(自然而然,因为 Rx 现在是 Microsoft 项目)。

所以,是的,在 C# 中有等价的... :-)

map、flatMap 和 flatMapLatest 的概念并不明显。我自己是 RxJS 的初学者,所以我希望我做对了......

map 获取 observable 的项目并将它们映射(转换)到其他东西。例如。可能是对数字的算术运算,将基元转换为对象或从对象中删除键等。

flatMap 有几个变体,但基本上它需要一个函数从源 observable 的每个项目返回一个 observable。这会产生一个流流(其中流 = observable = 项目序列),因此 flatMap 将其展平为单个流/可观察的,其中所有项目都按顺序排列。
嗯,令人困惑的解释,我担心......让我们用 Ascii 弹珠来解释。

--A------------------- // First stream
--a1----a2----a3------ // flatMap's function result
-----B---------------- // Second stream
-----b1----b2----b3--- // flatMap's function result
--a1-b1-a2-b2-a3-b3--- // flatMap

flatMapLatest 是一个 flatMap,其中仅发射当前 observable 的项目。如果有新的 observable 出现,则忽略前一个 observable 的值。

--A------------------- // First stream
--a1----a2----a3------ // flatMapLatest's function result
-----B---------------- // Second stream
-----b1----b2----b3--- // flatMapLatest's function result
--a1-b1----b2----b3--- // flatMapLatest

[编辑] 我编写了一些代码来更好地理解这些概念...... 显示 flatMapLatest 并不明显...... 我看到它用于 Ajax 请求:如果发出一个新请求,则无需考虑以前的请求。

演示:点击任何按钮都会显示原始事件。

  • 单击第一个按钮可查看丰富的事件(带地图)。
  • 单击第二个按钮以 1 秒间隔触发 5 个事件序列(平面图)。如果您在序列结束前再次单击,您会看到来自运行中的 observables 的交错结果。
  • 第三个按钮的作用类似,但使用 flatMapLatest,新的单击会丢弃前一个序列的结果。

// Generic code to display results

var results = document.getElementById('results');
function showHTML(html)
{
  results.insertAdjacentHTML('beforeend', html);
}
function show(text, obj)
{
  showHTML("<p>" + text + (obj !== undefined ? ': ' + JSON.stringify(obj) : '') + "<p>");
}
function showObject(obj)
{
  show("<p>" + JSON.stringify(obj) + "<p>");
}

// The real code

var button1 = document.querySelector('#button1');
var button2 = document.querySelector('#button2');
var button3 = document.querySelector('#button3');
var buttonClickStream1 = Rx.Observable.fromEvent(button1, 'click');
var buttonClickStream2 = Rx.Observable.fromEvent(button2, 'click');
var buttonClickStream3 = Rx.Observable.fromEvent(button3, 'click');

// Raw
Rx.Observable.merge(buttonClickStream1, buttonClickStream2, buttonClickStream3)
  .subscribe(
    function(v) { show("Value", v); },
    function(e) { show("Error", e); },
    function() { show("Done"); }
  );

// Map
buttonClickStream1
  .map(function (e, i) 
  { 
    e.id = i; // Add id
    e.t = new Date(); // Add timestamp
    return e; 
  })
  .subscribe(function(v) { show("Button 1", v) }); // Simplify: no errors, no completion

// FlatMap
buttonClickStream2
  // Returns several values
  .flatMap(function (e, i) 
  { 
    return Rx.Observable
      .interval(1000).take(5)
      .flatMap(function (x, j) { return Rx.Observable.of(i + ' ' + j) });
  })
  .subscribe(function(v) { show("Button 2", v) });

// FlatMapLatest
buttonClickStream3
  // Returns several values but keep only the last one
  .flatMapLatest(function (e, i) 
  { 
    return Rx.Observable
      .interval(1000).take(5)
      .flatMap(function (x, j) { return Rx.Observable.of(i + ' ' + j) });
  })
  .subscribe(function(v) { show("Button 3", v) });
<button type="button" id="button1">Test map</button>
<button type="button" id="button2">Test flatMap</button>
<button type="button" id="button3">Test flatMapLatest</button>
<div id="results"></div>

<script src="http://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.6/rx.lite.js"></script>

【讨论】:

  • 感谢您的详尽回复。我以前从未遇到过RAW示例。您能否解释一下什么是 RAW 以及我们什么时候可以使用?
  • 我所说的“原始”只是一种无需映射即可公开/显示事件的方式,即。无需处理。因此,“原始”术语。它所做的只是合并三个流(用于共同处理)并显示它们的内容。
猜你喜欢
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 2018-09-16
  • 1970-01-01
  • 2020-03-05
  • 2016-02-08
  • 2019-07-30
  • 2018-12-19
相关资源
最近更新 更多