为什么它将console.log作为Observble subscribe()函数的参数传递?

时间:2018-01-04 16:20:25

标签: javascript angular typescript observable angular-observable

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

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

所以课程$ 应该是可观察的数组(究竟是什么意思&lt; {} []&gt; 语法?)< / p>

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

3 个答案:

答案 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));

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