理解 RXJS 可观察输出的问题

2023-12-25

我对 rxjs 相当陌生,正在尝试学习。

我正在读这篇媒体文章 https://medium.com/javascript-in-plain-english/reactive-programming-in-javascript-8373201a6618并尝试理解这个 RXJS 输出:

import {Observable} from 'rxjs-es';
let output = Observable.interval(500)
             .map(i => [1,2,3,4,5,6][i]);

let result = output.map(num1 => num1)
    .filter(num1 => num1 > 4)
    .reduce((num1, num2) => num1 + num2);

result.subscribe(number => console.log(number));

输出:27

我不明白输出是如何变成 27 的,也不明白这个reduce 是如何工作的(以及reducer 的这两个参数是什么)。

有人可以告诉我发生了什么事吗? (我尝试在codesandbox上运行它,但是当我运行此代码时它会抛出错误)


理解Filter and Reduce运营商

正如其他人在评论中提到的,您引用的文章使用的是具有不同语法的旧版本 rxjs。对于此示例,我将使用从版本 6 开始的较新语法。

在 rxjs 中,有各种运算符可用于转换通过流发出的值。通常这些是这样导入的:

import { filter, reduce } from 'rxjs/operators';

还有许多生成器函数可用于创建值流。interval是这些函数之一,它将创建一个流,该流每隔n毫秒。导入如:

import { interval } from 'rxjs';

让我们创建一个简单的流:

number$ = interval(1000); // emit number every 1 second
// output: 0, 1, 2, 3, 4, 5...

我们可以将运算符应用于此流来转换排放:

的用法filter很简单。它只是发出通过给定真值测试的值(与Array.filter()方法)。

numbersLessThan4$ = numbers$.pipe(
    filter(number => number < 4)
);
// output: 0, 1, 2, 3

The reduce运算符有点复杂,其行为就像Array.reduce()方法。函数应用于每个发射值,并且能够存储在评估下一次发射时可以引用的值。

reduce有两个参数。第一个是接收当前发射的函数(cur) 和之前的累计结果 (acc)并返回一个新的累计值。第二个是初始值acc.

example:

sumOfNumbers$ = numbers$.pipe(
    reduce((acc, cur) => acc + cur, 0)
);

那么,让我们看看什么reduce何时做numbers$发出前 3 个数字:

  • 0
    • cur接收当前排放值0
    • acc从提供的默认值开始0
    • 表达方式acc + cur回报0
  • 1
    • cur接收当前排放值1
    • acc接收之前返回的值0
    • 表达方式acc + cur回报1
  • 2
    • cur接收当前排放值2
    • acc接收之前返回的值1
    • 表达方式acc + cur回报3

所以这很酷。我们可以将相当多的逻辑放入一行简单的代码中。一件重要的事情reduce是在源可观察对象完成之前它不会发出。现在,numbers$永远不会完成(interval()无限期地发出连续整数)。

我们可以使用take()运算符在发出一定数量的值后完成流。

Example:

numbers$ = interval(1000).pipe(take(5)); // completes after 5 emissions

sumOfNumbers$ = numbers$.pipe(
    // receives 5 values (0, 1, 2, 3, 4) and performs the logic described above.
    reduce((acc, cur) => acc + cur, 0) 
);
// output: 10

可以使用多个运营商来转换排放。只需在里面提供多个pipe():

sumOfNumbersLessThan4$ = numbers$.pipe(
    filter(number => number < 4),
    reduce((acc, cur) => acc + cur, 0) 
);
// output: 6
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解 RXJS 可观察输出的问题 的相关文章

随机推荐

  • 有某种方法可以禁用 Angular 2 中的一组输入吗?

    我在 md card 中有一些输入 有一种方法可以这样做
  • Bison/Yacc 语法中的无意串联

    我正在尝试 lex 和 yacc 并遇到了一个奇怪的问题 但我认为最好在详细说明问题之前向您展示我的代码 这是我的词法分析器 include
  • 如何有效地将阵列旋转±180°?

    对于 C 语言和衍生物 Python Cython 纯 C 使用最少的内存和操作将非方形 M N 数组绕其中心旋转 180 的最佳算法是什么 假设out是一个初始化的副本array M and N它们的行数和列数 我们使用从 0 到 M 1
  • Javascript 从 toLocaleDateString 解析日期以获取已知区域设置

    背景 在我的应用程序中 我想根据用户的区域设置设置日期格式 如果用户修改日期 我希望能够将其解析回 javascript Date 对象 Problem 我想知道是否可以使用 javascript 从本地格式化的字符串中解析日期 请考虑以下
  • PST 到 CSV 文件转换

    有谁知道通过命令行将 pst 转换为 csv 文件的好工具 您可以假设计算机上安装了 Outlook 吗 如果是这样 我相信它可以使用 OLE 或类似的东西进行后台脚本编写 我已经使用 Ruby 通过 Excel 完成了文件转换 这是一个P
  • 有没有办法将 SharedPreferences 存储到 SD 卡上?

    我编写了一个具有多个硬编码设置 例如 fontSize 或 targetDirectory 的应用程序 我希望能够偶尔更改这些类型的设置 SharedPreferences 似乎是解决此问题的一种方法 但我想共享此应用程序和设置 并且我的手
  • 使用参数从终端运行 Jython 脚本

    我想从命令行调用 Jython 脚本 例如 Applications Fiji app Contents MacOS ImageJ macosx headless little jython script py 我了解 Python 以及
  • GtkTreeView 由于排序而导致插入/更新性能损失

    在将许多行插入 GTK 树视图 使用 PyGTK 或修改许多行时 我遇到了性能问题 问题是模型似乎在每次更改 插入 修改 后都会被重新使用 这会导致 GUI 挂起数秒 通过注释使模型不排序model set sort column id S
  • 从 CLLocation 数组创建 GPX 文件

    我的应用程序需要使用应用程序在设备内共享 CLLocations 路由 数组 在此之前我没有使用 GPX 的经验 GPX 是最好的格式吗 如何从给定的此类 CLLocations 数组创建 GPX 文件 Objective C 中有标准的
  • 生成的 PDF 中自动换行(使用 jsPDF)?

    我正在做的是使用 jsPDF 创建我生成的图表的 PDF 但是 我不确定如何包装标题 通过使用 text 函数添加 标题的长度因图表而异 目前 我的标题已经从页面上消失了 任何帮助 将不胜感激 这是我到目前为止的代码 var doc new
  • 从 Lambda 中的 S3 通知事件获取非 ASCII 文件名

    The keyAWS S3 通知事件中表示文件名的字段已进行 URL 转义 当文件名包含空格或非 ASCII 字符时 这一点很明显 例如 我已将以下文件名上传到 S3 my file txt 收到的通知如下 Records s3 objec
  • 使用volley时如何保持进度条状态?

    当我将 AysncTask 与片段回调一起使用时 维护进度条状态很容易 但我应该如何用 volley 实现它 我不能使用 AsyncTask 因为它已经过时了 而且 volley 更好更快 任何帮助或提示将不胜感激 我正在使用谷歌的齐射来发
  • 使用空格而不是制表符进行缩进的性能影响

    我目前使用软制表符 即空格 来缩进 Ruby 代码 如果我使用硬制表符 在解释代码时会提高性能吗 我认为读取 1 个制表符比解析 4 个空格字符 尽管可以忽略不计 要快 您是否了解源代码解释所涉及的所有阶段 只有第一个 词法分析 必须处理空
  • spring data elasticsearch继承查询没有结果

    我在继承和 ElasticsearchRepository 方面遇到一些麻烦 我的代码 简短版本 实体 public abstract class father Id protected String identifier construc
  • Highchart / Highstock 如何设置单个 ohlc 或蜡烛的颜色?

    I have set up a highstock ohlc https www highcharts com stock demo ohlc with angular 2 But can not set the up and down c
  • 使用 wkhtmltopdf 或任何其他免费工具的 C# html 到 pdf 转换器 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在 C 中将 html 转换为 pdf 的完美工具是什么 我通过 stackoverflow com 找到了 wkhtmltopdf 但它
  • 更改亮度滤镜

    我尝试使用 jQuery 更改页面上某些图像的亮度过滤器 css 属性 但在控制台中收到以下错误 解析 过滤器 值时出错 声明被删除 这是我正在使用的代码 function changeBrightness myImg css filter
  • 从 Pandas Dataframe 写入格式化的二进制文件

    我已经看到了一些将 Python 中的格式化二进制文件读取到 Pandas 的方法 也就是说 我使用的代码使用 NumPy fromfile 进行读取 该文件使用 dtype 给定的结构进行格式化 import numpy as np im
  • 根据向量提供的变量名称和权重创建平均变量

    假设我想在给定的数据框中基于两个向量创建一个均值变量 一个指定要使用的变量的名称 另一个指定这些变量应进入均值变量的权重 vars lt c a b c d weights lt c 0 5 0 7 0 8 0 2 df lt data f
  • 理解 RXJS 可观察输出的问题

    我对 rxjs 相当陌生 正在尝试学习 我正在读这篇媒体文章 https medium com javascript in plain english reactive programming in javascript 8373201a6