创建一次性订阅

Ber*_*nez 152 rxjs

我需要创建一个Observable在第一次调用时立即处理的订阅.

是否有类似的东西:

observable.subscribeOnce(func);
Run Code Online (Sandbox Code Playgroud)

我的用例,我在快速路由处理程序中创建订阅,并且每个请求多次调用订阅.

Bra*_*don 274

不是100%肯定你需要什么,但如果你只想观察第一个值,那么使用first()或者take(1):

observable.first().subscribe(func);
Run Code Online (Sandbox Code Playgroud)

注意:当条件满足时.take(1),.first()两者都会自动取消订阅

从RxJS 5.5+更新

来自Coderer的评论.

import { first } from 'rxjs/operators'

observable
  .pipe(first())
  .subscribe(func);
Run Code Online (Sandbox Code Playgroud)

这就是原因

  • 是的,它确实.当他们的状况得到满足时,首先取消订阅. (49认同)
  • 订阅是否会在以后自动清理? (30认同)
  • 如果有人在2018年来到这里,你实际上想要`observable.pipe(first()).subscribe(func)`,其中`first`来自`rxjs/operators`. (28认同)
  • 为什么文档没有说它会自动处理订阅? (19认同)
  • 这是一个通用的RxJS规则,当可观察流结束时,将处理订阅.这意味着任何"缩短"流(或将其转换为不同类型的流)的运营商将在其操作完成时取消订阅源流.我不确定文档中的位置或是否说明了这一点. (17认同)

小智 29

RxJS有一些我见过的最好的文档.按照下面的链接将带您到一个非常有用的表格映射用例到操作员.例如,在"我要采取的第一个值"的使用情况:三家运营商:first,firstOrDefaultsample.

注意,如果可观察序列在没有通知的情况下完成,则first运营商在运营商向订户firstOrDefault提供默认值时通知订户错误.

运算符用例查找


M F*_*ajj 8

如果你只想调用一个 Observable 一次,这意味着你不会等待来自它的流。因此,在您的情况下使用toPromise()而不是subscribe()就足够了,因为toPromise()不需要取消订阅。