将 "console.log" 传入 subscribe() 以获得可观察对象

Passing in "console.log" into subscribe() for an observable

通常,当我想从 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, num) => [...acc, num], []));
transform.subscribe(console.log);

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

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

这里有一个 Blitzy 可以玩。

看来您还没有完全理解 lambda 的工作原理(或者从未意识到),所以让我尝试启发您。 ;-)

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

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

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

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

更新

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