Javascript 无论RxJS中是否有数据,如何从Obserable.subscribe调用函数一次?

Javascript 无论RxJS中是否有数据,如何从Obserable.subscribe调用函数一次?,javascript,angular,typescript,rxjs,frontend,Javascript,Angular,Typescript,Rxjs,Frontend,有一个从端点获取数据的可观察对象: this.get().pipe( filter(item => item.id = providedId) ).subscribe((data) => { specialFunction(data); }) 当RxJS的filter方法找到一个条目时,它会触发subscribe,一切都按预期进行。 但当过滤器找不到项目时,订阅不会被触发。但我也想处理这个场景。我已尝试使用complete: this.get().pipe( filte

有一个从端点获取数据的可观察对象:

this.get().pipe(
  filter(item => item.id = providedId)
).subscribe((data) => {
  specialFunction(data);
})
当RxJS的filter方法找到一个条目时,它会触发subscribe,一切都按预期进行。 但当过滤器找不到项目时,订阅不会被触发。但我也想处理这个场景。我已尝试使用complete:

this.get().pipe(
  filter(item => item.id = providedId)
).subscribe({
    next: (data) => {
       specialFunction(data);
    },
    complete: (data) => {
       specialFunction();
    }
})
但是,如果存在数据,则会调用specialFunction两次:一次调用数据,一次调用完成的函数


如何处理observable,以便我可以调用一次specialFunction,无论是否有数据,如果有数据,则包含数据?

您可以在订阅中筛选数据

this.get().subscribe((data) => {
    const filteredData = data.filter(item => item.id = providedId);
    specialFunction(filteredData);
});


function specialFunction(data: any|undefined) {
    ...
}

你真的不想使用过滤器。使用映射并在订阅中处理匹配:

this.get().pipe(
  map(item => { isMatch: item.id == providedId, item })
).subscribe({
    next: (data) => {
       if (data.isMatch) {
           specialFunction(data.item);
       } else {
          // handle non-match
       }
    },
    complete: (data) => {
       specialFunction();
    }
})

我不明白为什么您不能在rxjs映射中检查您的条件,如果条件通过,则返回真实值,否则返回其他值。但如果你放弃另一个选择,你可以

可能使用:

根据条件订阅第一个或第二个可观测值

所以也许是这样的:

import { of, iif } from "rxjs";
import { mergeMap, filter } from "rxjs/operators";

// ...

this.get()
  .pipe(
    mergeMap(item =>
      iif(() => item.id === providedId
        // if truthy return this
        of(item),
        // if falsy, return null or whatever you like
        of(null)
      )
    )
  )
  .subscribe(data => {
    if (data) {
      specialFunction(data);
    }
  });

仅在完成时处理它,并使用if data{…}启动处理程序?这是一个想法,但是如何从下一个到完成地很好地传递数据呢?谢谢,实际上有多个项目可以满足过滤器的要求。我不知道这样行不行