在这个 Angular 2 示例中,这种 Observable 行为究竟是如何工作的?

Posted

技术标签:

【中文标题】在这个 Angular 2 示例中,这种 Observable 行为究竟是如何工作的?【英文标题】:How exactly works this Observable behavior in this Angular 2 example? 【发布时间】:2018-03-06 08:24:40 【问题描述】:

我不太喜欢 javascript\TypeScript,我对这段代码的工作原理有以下疑问:

  onGet() 
    this.serverService.getServers()
      .subscribe(
        (servers: any[]) => this.servers = servers,   // an array of anything (or an array of server)
        (error) => console.log(error)
      );
  

据我所知,onGet() 方法正在调用返回 **Observable 的 getServers() 方法,因此它订阅了这个返回的 Observable 对象。

据我所知,Observable 的概念是:当这个对象发生变化时(触发事件时,如果我做错了断言,请纠正我),执行与匿名内部函数相关的代码。

但是在这里我不太确定这段代码的确切含​​义以及如何正确阅读它:

    (servers: any[]) => this.servers = servers,   // an array of anything (or an array of server)
    (error) => console.log(error)

您能帮我了解一下具体是如何工作的吗?

【问题讨论】:

你到底有什么不明白的?打字?箭头函数语法?你读过例如typescriptlang.org/docs/home.html?参见例如meta.***.com/q/253894/3001761 并且更具体。 我在 angular-2-training-book.rangle.io/handout/observables/…987654323@ 【参考方案1】:
   // this function will resolve for a response, which is not an error
   (servers: any[]) => this.servers = servers,
   // this will resolve if the response is an error:
   //either a http error or thrown error
   (error) => console.log(error)

大概,对serverService 的调用请求服务器列表,而this.servers 是从该列表中设置的。如果出现错误(如 4XX 或 5XX 错误),控制台将显示错误。在任何情况下,observable 都会被解析并关闭。对于可以在稍后某个时间点更新的“活”可观察对象,可以使用某种类型的 Subject

【讨论】:

【参考方案2】:
(servers: any[]) => this.servers = servers,   // an array of anything (or an array of server)
(error) => console.log(error)

等价于

(servers: any[]) =>  //success callback
       this.servers = servers;   // an array of anything (or an array of server)
,
(error) =>  //error callback
        console.log(error);

第一个是success回调,第二个是error回调,根据getServers()返回的结果执行

【讨论】:

内联表单也返回结果。 是的。我刚刚把它变成了更易读的格式。那是实际的用户问题。 我的意思是你的等价物没有。也不清楚这 OP 的实际问题。

以上是关于在这个 Angular 2 示例中,这种 Observable 行为究竟是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

在这个 Angular 2 应用程序中,这种跨组件通信“模式”究竟是如何工作的?

如何在 Angular 的 HttpClient 中使用 reportProgress? [复制]

如何在 Angular Universal 中检测屏幕分辨率?

这个简单的 PrimeNG Angular 2 示例究竟是如何工作的?

为啥在这个 angular2 示例中我仍然需要 @inject?

Angular 2.0 和模态对话框