【问题标题】:How to get the data from an observable stream如何从可观察流中获取数据
【发布时间】:2020-01-29 04:23:04
【问题描述】:

当我需要在 Angular 组件中访问数据时,从可观察流中访问数据的最佳方式是什么?我知道我可以在模板中使用异步管道,但我需要访问实际组件中的数据。

到目前为止,我已经通过点击或订阅将数据提取到一个新变量中,但我只是好奇我是否错过了一种更简单或更简洁的方法。如果没有,在点击和订阅之间是否有首选方法?

//assume db.getBook() returns an observable with a book object
this.subscription = db.getBook("153").pipe(   
   tap(book => this.book = book).subscribe()

//or

this.subscription = db.getBook("153").subscribe(book => this.book = book)

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    .pipe 方法用于链接可观察运算符,您将始终获得发出的数据。此外,管道方法允许 webpack 从最终的 JavaScript 包中删除未使用的运算符。它使构建更小的文件变得更加容易。

    .tap 透明地执行操作或副作用,例如日志记录。它不会修改流。

    .subscribe 只会被调用一次,用于订阅可观察的响应。此外,我们可以将响应放入某个变量中以将其显示到视图中。

    模板最好使用async管道:

    <option *ngFor="let item of items$ | async">
         {{ item?.name }}
    </option>
    

    从后端分配数据,可以使用subscribe()方法:

    this.yourService.getYourData()
        .subscribe(val => 
           this.items = val
        );
    

    The comment of source code of tap() method says:

    这个操作符对于调试你的 Observables 是很有用的 值或执行其他副作用。

    注意:这与 Observable 上的 subscribe 不同。如果 tap 返回的 Observable 未订阅,副作用 观察者指定的将永远不会发生。 tap 因此很简单 监视现有执行,它不会触发执行 像subscribe 那样发生

    所以最好使用subscribe方法来分配数据,因为:

    • 您最终的 JavaScript 包会更轻量级,并且不会包含 tapmethod
    • 如果tap返回的Observable没有被订阅,副作用 观察者指定的将永远不会发生。所以无论如何,你需要调用subscribe 方法。因此,如果您只想分配数据,则无需使用tap 方法

    【讨论】:

    • 这很有道理,可能是我听过的最好的解释。感谢您的详细回答!
    • @mattc19 很高兴对你有帮助!:)
    • @StepUp,对此提出建议,stackoverflow.com/questions/58172059/…,谢谢
    猜你喜欢
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多