首页 > 解决方案 > 如何在 behaviorSubject 上使用 shift?

问题描述

我有一个带有 BehaviorSubject 的课程:

export class WordsService {
    private words = new BehaviorSubject<WordType[]>([]);

它被订阅了:

init() {
    this.databaseService.fetchWords().subscribe(
        (listaWords: WordType[]) => {
            this.words.next(listaWords);
        },
        errors => console.error('err'),
        () => console.log('suceed')
    )
}

当我重构这段代码时:

private fetchWord(): void{
    this.word = this.wordService.getWords().shift();
}

我正在尝试使用 .shift 获取变量 word 以获取数据,以便它可以一次从 observable 中获取一个元素,以及何时完成所有元素的获取。

标签: node.jsangulartypescriptrxjs

解决方案


看起来您正在尝试将结果从 aWordType[]转换为 single WordType

您可以通过应用这样的map()运算符来做到这一点:

init(){
  this.databaseService.fetchWords().pipe(
    map(words => words.shift())
  )
  .subscribe(
    (listaWords: WordType[]) => {
      this.words.next(listaWords);
    },
    errors => console.error('err'),
    () => console.log('suceed')
  )
}

但是,您实际上并不需要 BehaviorSubject 来执行此操作,您可以直接从服务调用中简单地声明您的 observable:

public word: Observable<WordType> = this.databaseService.fetchWords().pipe(
  map(words => words.shift()),
  catchError(error => console.log(error))
);

现在,wordobservable 只会发出你感兴趣的值。

这使您可以使用async模板中的管道来管理订阅,而无需在控制器中自己进行。


推荐阅读