2025-01-03 09:00:06

创建一次性订阅

我需要创建一个可观察对象的订阅,当它第一次被调用时立即被处理。

比如:

observable.subscribeOnce(func);

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


当前回答

Observable.pipe (take(1)).subscribe()使用take 1它订阅一次然后退出

其他回答

我也有类似的问题。

下面是稍后从不同的状态更改器调用的。因为我不想这么做。

function foo() {
    // this was called many times which was not needed
    observable.subscribe(func);
    changeObservableState("new value");
}

我决定在订阅后尝试unsubscribe(),如下所示。

function foo() {
    // this was called ONE TIME
    observable.subscribe(func).unsubscribe();
    changeObservableState("new value");
}

订阅(函数).unsubscribe ();类似于subscribeOnce(func)。

我希望这对你也有帮助。

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

observable.first().subscribe(func);

注意:.take(1)和.first()都在满足条件时自动取消订阅

从RxJS 5.5+更新

来自Coderer的评论。

import { first } from 'rxjs/operators'
    
observable
  .pipe(first())
  .subscribe(func);

这是为什么

更新(2021年12月):

在RxJS 7中,promise()函数已经被弃用,新的函数已经被宣布用来代替它。firstValueFrom和lastValueFrom。

函数firstvaluefrom解析第一个发出的值,并直接从资源取消订阅。当Observable完成而没有释放任何值时,它会以EmptyError拒绝。

另一方面,lastValueFrom函数在某种程度上与toPromise()相同,因为它解析了可观察对象完成时发出的最后一个值。然而,如果该可观察对象没有发出任何值,它将拒绝一个EmptyError。不像toPromise(),当没有值发出时解析为undefined。

欲了解更多信息,请查看文档。


旧的回答:

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

为了补充@Brandon的回答,使用first()或类似的方法对于根据其Observable更新BehaviorSubject也是必不可少的。例如(未经测试):

var subject = new BehaviorSubject({1:'apple',2:'banana'});
var observable = subject.asObservable();

observable
  .pipe(
    first(), // <-- Ensures no stack overflow
    flatMap(function(obj) {
      obj[3] = 'pear';
      return of(obj);
    })
  )
  .subscribe(function(obj) {
    subject.next(obj);
  });

Observable.pipe (take(1)).subscribe()使用take 1它订阅一次然后退出