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



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

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

当RxJS的filter方法找到一个项时,它会触发subscribe,一切都按预期进行。但当过滤器找不到项目时,订阅不会被激发。但我也想处理这种情况。我已经尝试使用完整的:

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

我不明白为什么你不能在rxjsmap中检查你的条件,如果条件通过,就返回truthy值,如果没有,就返回"其他东西"。但要放弃另一种选择,你可以。。。

可能使用iif:

订阅基于条件的第一个或第二个可观察

也许是这样的:

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

最新更新