0

我是 Angular 和函数式编程的新手,我对这种语法有疑问(我认为应该与函数式编程行为有关):

courses$: Observable<{}[]>;
.................................
.................................
.................................
this.courses$.subscribe(console.log);

所以courses$应该是一个Observable数组( <{}[]>语法到底是什么意思?)

最后一行似乎将订阅的内容打印到 JavaScript 控制台中。但是这种语法到底是什么意思?我知道console.log()是一个函数,它以必须打印的值作为参数。为什么在这种情况下它作为 subscribe 函数的参数而不以 () 结尾?

4

3 回答 3

2

为了更好地理解它:在 JavaScript 中,函数是第一类对象,这意味着它们可以被视为普通变量、作为参数传递、更改或删除。看看这个:

something => console.log(something)

如您所见,这是一个将某些内容记录到控制台的函数。什么是console.log?好吧,这是一个将某些内容记录到控制台的函数,没有什么不同!

考虑这个伪代码

Observable.prototype.subscribe = function(callback) {
   // every time a new value is emitted 
   callback(newValue);
}

当然,这并不是该.subscribe方法的实际实现方式,但它本质上是这样的:当一个 observable 接收到一条新数据时,它将调用您提供的回调,将next值作为第一个参数传递给该回调. 希望这可以为您解决问题。

于 2018-01-04T16:32:23.130 回答
1

它将函数引用传递console.logsubscribe. 订阅将在稍后发布订阅时调用该函数。它传递的参数由订阅决定,在它触发时。这只是将回调函数传递给订阅。

于 2018-01-04T16:22:03.467 回答
1

subscribe接受一个函数作为类型的参数(parameter: T) => void,其中 T 是 的模板Observable<T>

这三个工作类似:

this.courses$.subscribe(console.log);
this.courses$.subscribe(function (p: {}[]): void { console.log(p); });
this.courses$.subscribe((p: {}[]): void => console.log(p));

每种类型的函数声明之间捕获的变量和范围存在一些差异,但在这个特定的示例中它们的工作方式相同。

于 2018-01-04T16:28:52.070 回答