在Angular中使用.pipe()和.subscribe()时的控制流

问题描述 投票:3回答:1

在这种情况下,我对代码流程有些困惑。请参考下面的代码。

import { fromEvent } from 'rxjs';
import { mapTo } from 'rxjs/operators';

let btn = document.getElementById("btnclick");
let btn_clicks = fromEvent(btn, 'click');
let positions = btn_clicks.pipe(mapTo ("Testing MapTo"));
positions.subscribe(x => console.log(x));

当我单击按钮时,它输出Testing MapTo。一开始我以为只要单击按钮,就会调用.pipe()方法,然后再调用.subscribe()方法,使它在console中输出。但是我读过,

subscribe is for activating the observable and listening for emitted values

link中。

问题:

  1. 由于.subscribe()在.pipe()之后被调用,所以它如何工作?我的意思是,仅在.subscribe()获得值之后,它才如何通过.pipe()?请帮助我理解这一点。
  2. 当我们进行这样的http调用时会发生什么(说返回的observable是x ::
this.http.get('url')
    .pipe(
      filter(x => x % 2 === 0),
      map(x => x + x)
    )
    .subscribe(x => {
        console.log(x);
    }
angular rxjs pipe observable subscribe
1个回答
4
投票

当您了解pipe的含义时,流程将变得清楚。它按照它所说的那样,在源和订阅发出的值之间传递内容。

source --->     modify results by       ---> subscription
               piping in operators

问题1

click  --->  map (convert) click event     --->   console.log(x)
event        to string "Testing MapTo"

问题2

   Http     --->  go forward only if   --->   map (convert)     ---> console.log(x)
observable        number is even            result = 2 * result

更新

[预订了可观察对象时(例如positions.subscribe(x...),将调用Observable类的subscribe方法。之后,回调函数进入中断模式,并等待观察对象发出。这是关键。订阅会触发可观察到的操作中的语句序列,但是not并不知道何时可观察到的将发出。这就是为什么将可观察值称为获取值的方法。准备就绪时,可观察对象将输出推送。一旦触发了可观察类中的subscribe功能,subscribe功能就会发挥作用。因为请记住,可观察对象不是直接订阅的。是pipe。它类似于语句pipe。应用于someObs.pipe(...).subscribe()someData.getSum().getAverage()功能的结果将是getSum()功能的输入。同样,管道中的运算符将应用于源可观察对象,该源将返回新的修改后的可观察对象。订阅将等待此可观察的结果。

非正式示例

订购比萨饼场景

someData

这里要注意的两件事:

  1. 您订购披萨,然后等待。您不知道什么时候会收到披萨(非正式地说,一些特权人士可能会调用优势并排长队)。订阅不知道何时接收数据的方式相同。这就是使它异步的原因(幸运的是,RxJS不会基于任何事物进行区分)。无论其属性如何,所有订阅都将等待。

  2. 现在,很容易会误认为订阅与可观察项没有任何关系。只是观察者正在等待接收数据,而可观察对象已经开始处理它的语句。那是错误的。在这种情况下,订阅回调应在您订阅后立即接收数据。但是实际上,可观察对象直到被订阅后才开始。
© www.soinside.com 2019 - 2024. All rights reserved.