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{…}启动处理程序?这是一个想法,但是如何从下一个到完成地很好地传递数据呢?谢谢,实际上有多个项目可以满足过滤器的要求。我不知道这样行不行