我是Angular和函数式编程的新手,我对这种语法有疑问(我认为应该与函数式编程行为有关):
courses$: Observable<{}[]>;
.................................
.................................
.................................
this.courses$.subscribe(console.log);
所以课程$ 应该是可观察的数组(究竟是什么意思&lt; {} []&gt; 语法?)< / p>
最后一行似乎在订阅内容中打印到JavaScript控制台。但究竟是什么意思呢?我知道 console.log()是一个函数,它将必须打印的值作为参数。为什么在这种情况下,它是订阅函数的结构,它不以()结束?
答案 0 :(得分: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
值作为该回调的第一个参数。希望这能为你解决问题。
答案 1 :(得分:1)
将console.log
(函数引用)传递给subscribe
。订阅将在订阅发布时调用该函数。它传递的参数由subscribe决定,在它触发时。这只是将回调函数传递给subscribe。
答案 2 :(得分: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));
在每种类型的函数声明之间捕获的变量和作用域之间存在一些差异,但在这个特定示例中它们的工作方式相同。