将 "console.log" 传入 subscribe() 以获得可观察的 更新

问题描述

通常,当我想从 observable 打印一些结果时,我会这样做。

const source = interval(3000);
const transform = source.pipe(scan((acc,num) => [...acc,num],[]));
transform.subscribe(res => console.log("%c" + res,"color:orange;"));

今天,我注意到我可以像这样将 console.log 传递到 observable 中。

const source = interval(3000);
const transform = source.pipe(scan((acc,[]));
transform.subscribe(console.log);

它很整洁,我喜欢它。问题是我没有设法传入额外的参数来将 CSS 强加到控制台输出的东西上,这让我想到,也许我传入的东西与旧的 {{1 }} 开始。 (天真地将参数传入 console.log() 产生了错误。)谷歌搜索的解释只导致如何登录控制台,而没有讨论其他方式或原因。

在第二个示例中使用 subscribe() 的语法时,我可以将额外的参数传递给 console.log 吗?如果是这样,如何?如果没有,为什么?

这里有一个 Blitzy 可以玩。

解决方法

似乎您没有完全理解 lambdas 是如何工作的(或者从未意识到它),所以让我试着启发您。 ;-)

每当一个函数获取一个函数作为参数时,您可以提供要使用的方法或使用粗箭头运算符在该位置编写匿名函数(您也可以使用打字稿或javascript方式编写函数).

然后外部方法获取您的方法作为参数并使用参数调用它。由于您的外部方法 .subscribe() 需要一个具有一个参数且没有返回值的方法,因此方法 console.log(text: string) 完全匹配,因此允许更短的写作。

不幸的是,只要这种完全匹配不符合您的要求,您就必须定义一个内联函数,该函数使用所需的更改参数调用内部方法。

所以,只要你有类似 foo((a,b,c) => this.something(a,c)) you could rewrite it to foo(this.something)` 的东西。但是,一旦您想更改参数顺序等最小的事情或向一个参数添加一个常量值(如您的情况),您就不能使用速记。

更新

UPS,只是忘记了 JS 和 TS 中的绑定。所以胖箭头操作员也有第二份工作。当您查看代码时,它确保 this 指向预期的对象。因此,JS 和 TS 中的简写只有在外部方法与内部方法具有相同的 this 时才真正有效(在 Rx 中永远不会如此),这意味着即使参数顺序完全匹配,您也必须采用粗箭头运算符和速记仅适用于某些全局静态方法,例如 console.log()