【问题标题】:when to use tap() and when to use map() in RxJS在 RxJS 中何时使用 tap() 以及何时使用 map()
【发布时间】:2020-02-18 07:10:53
【问题描述】:

该文档使用以下代码描述了 tap():

import { fromEvent } from 'rxjs';
import { tap, map } from 'rxjs/operators';

const clicks = fromEvent(document, 'click');
const positions = clicks.pipe(
  tap(ev => console.log(ev)),
  map(ev => ev.clientX),
);
positions.subscribe(x => console.log(x));

但我不明白为什么要使用水龙头。难道只是记录。解释说

将每次点击映射到该点击的 clientX 位置,同时也 记录点击事件

【问题讨论】:

  • tap() 是一个只执行副作用的运算符。当然,您可以将console.log() 放入map(),但通常不鼓励这样做。
  • 如果您使用 console.log() 而不是 ev.clientX - x 将是 undefined,例如日志记录将返回 undefinedmap - 数据转换,tap - 副作用(不会对您的数据产生任何影响)。

标签: rxjs angular2-observables


【解决方案1】:

Tap

对源 Observable 的每个发射执行副作用,但返回与源相同的 Observable

示例:

tap(value => console.log(value))

Map

将给定的项目函数应用于源 Observable 发出的每个值,并将结果值作为 Observable 发出。

示例:

map(value => 'prefix' + value)

为什么不使用 map 或其他运算符来实现 log 等副作用

您可以使用 map、scan 和任何其他获取函数并返回单个结果的运算符来实现副作用。这将使您的代码将来很难理解/调试/查找错误。前提是,通常在管道中使用副作用是不好的。如果您需要/想要它并且不希望每个日志记录点都有很多订阅,那么日志记录可能是一个例外。因此,点击可能很有用。您可以将其调整为以下步骤:

  1. 尽量避免副作用
  2. 如果您需要一些(日志记录),请使用点击来说明有副作用

如何做但不应该做的例子

switchMap(value => {
  console.log(value); // Side effect 1
  const newValue = foo(value);
  console.log(newValue); // Side effect 2
  return of(newValue);
})

你可以做和应该做的例子

tap(console.log), // Side effect 1
switchMap(value => of(foo(value))),
tap(console.log) // Side effect 2

最后一句话:当你最初编写的代码并没有带来太多好处时。您的项目越大,并且其他人试图找到错误的那一刻,它会大大节省时间。

【讨论】:

  • 你会把arr => arr.sort()放在哪里?原始数组已修改,但将其放入 tap 而不是 map 是否是一种好习惯?
  • 您的问题没有上下文,因此不能 100% 安全地正确回答。但正如我猜想的那样,您正在从某个可观察对象接收您的arr,并且您处于管道之间,并且希望稍后在某些订阅中以某种方式使用此值。由于arr.sort() 已经为您返回正确的排序数组,您可以像在描述的答案中那样使用 map 。如果您不想在以后的订阅中使用arr 值,我会问自己为什么arr.sort() 通常必须在管道内完成。我建议要么坚持使用 rxjs,或者如果你有命令式代码 - 坚持下去。
  • 我的意思是当必须对数组进行排序然后在以后的订阅中使用时(想象一下您想要在下拉列表中显示的语言选择列表 - 响应没有对它们进行排序但您想要排序它们在显示之前)。 maptap 的结果是相同的,但有最佳实践吗?使用map 不必要地返回相同的数组实例是不好的做法吗?使用tap 对值进行更改会是不好的做法吗?我想应该有一个偏好,否则你会让开发人员在整个项目中混合使用。
猜你喜欢
  • 2019-03-25
  • 1970-01-01
  • 2019-10-17
  • 2014-01-16
  • 2015-09-06
  • 2021-05-31
  • 2016-02-11
  • 2017-03-16
  • 1970-01-01
相关资源
最近更新 更多