创建一次性订阅

时间:2015-01-18 06:38:20

标签: rxjs

我需要创建对Observable的订阅,该订阅在首次调用时会立即处理。

是否有类似的东西:

observable.subscribeOnce(func);

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

6 个答案:

答案 0 :(得分:226)

不是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);

Here's why

答案 1 :(得分:26)

RxJS有一些我见过的最好的文档。按照下面的链接将带您到一个非常有用的表格映射用例到操作员。例如,在“我想取第一个值”下,用例是三个运算符:firstfirstOrDefaultsample

注意,如果可观察序列完成且没有通知,则first运算符会在订阅者向firstOrDefault运算符提供默认值时通知订阅者。

operator use case lookup

答案 2 :(得分:5)

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

答案 3 :(得分:3)

干净方便的版本

扩展M FuatNUROĞLU关于将可观察对象转换为应许对象的惊人答案,这是它的非常方便的版本。

const value = await observable.toPromise();

console.log(value)

这样做的好处是我们可以像普通变量一样使用该值,而无需引入另一个嵌套块!

当您需要从多个可观察对象获取多个值时,这特别方便。干净整洁。

const content = await contentObservable.toPromise();
const isAuthenticated = await isAuthenticatedObservable.toPromise();

if(isAuthenticated){
   service.foo(content)
}

当然,如果要使用此路由,则必须使包含函数async生效。如果您不希望包含函数异步,也可以.then承诺

我不确定这种方法是否存在折衷,请随时在评论中告知我,以便我们了解。

P.S。如果您喜欢这个答案,别忘了同时赞扬M FuatNUROĞLU的答案:)

答案 4 :(得分:0)

要补充@Brandon's answer,使用first()等对于基于BehaviorSubject更新Observable也是必不可少的。例如(未试用):

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);
  });

答案 5 :(得分:0)

我有类似的问题。

以下甚至是后来从不同的状态转换器调用的。如我所愿。

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");
}

subscribe(func).unsubscribe();就像subscribeOnce(func)

希望对您有帮助。