【问题标题】:Why is it passing the console.log as argiment of the Observble subscribe() function?为什么将 console.log 作为 Observble subscribe() 函数的参数传递?
【发布时间】:2018-06-14 10:12:24
【问题描述】:

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

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

所以 courses$ 应该是一个 Observable 数组( 语法到底是什么意思?)

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

【问题讨论】:

  • Observable&lt;{}[]&gt; 表示它是一个普通对象数组的Observable,例如[{},{},{}]

标签: javascript angular typescript observable angular-observable


【解决方案1】:

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

something => console.log(something)

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

考虑一下这个伪代码

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

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

【讨论】:

    【解决方案2】:

    subscribe 接受一个函数作为(parameter: T) =&gt; void 类型的参数,其中T 是Observable&lt;T&gt; 的模板。

    这三个的工作方式类似:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 此外,如果您传入console.log(),您将执行该函数并传入其结果,而不是对该函数本身的引用。
      • Subscribe 稍后会在 observable 调用 next 函数时调用该函数。它不会在completeerror 上调用,这就是subscribe 方法的参数2 和3 的作用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2011-10-27
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多