在 Angular 中使用 Rxjs 的顺序 API 调用和 null return
Sequential API call using Rxjs in Angular with null return
我有一个场景,我需要使用 Angular
中的 RxJs
进行顺序 API 调用,我已经完成了,但我遇到了这个空错误。为了调用第二个 api,我将从第一个 API 接收 id
,它可以是 null
或 undefined
。所以我想要的如果 id 不可用我将 return of(null)
否则将 return 响应。但是有一些打字错误。以下是我到目前为止所做的。
of(personId).pipe(
take(1),
switchMap((personId: string) => {
return this.personService.getById(personId).pipe(
concatMap((person: Person) => {
const classId = person?.class?.id || null;
let class$ = of(null);
if (classId) {
class$ = this.classService.getById(classId); // Will return Observable<Class>
}
return combineLatest([of(person), class$])
})
)
}),
tap(([person, class]) => {
console.log('Person: ', person);
console.log('Clas: ', class);
})
).subscribe()
class$ = this.classService.getById(classId);
在这条线上我遇到了'TS2322: Observable is not assignable to Observable`
关于如何解决这个问题有什么建议吗?还可以改进此代码吗?
你可以用这一行替换条件逻辑
let class$= classId?this.classService.getById(classId):of(null)
this.classService.getById
返回的 observable 与 of(null)
返回的不同,因此您不能用它重新分配 class$
变量。
不过,只需使用三元运算符定义 class$
即可轻松解决您的问题,如下所示:
const class$ = person?.class?.id ? this.classService.getById(classId) : of(null);
首先这个of(personId)
看起来很奇怪。
为什么不呢:
this.personService.getById(personId).pipe(
concatMap((person: Person) => {
const class$ = person?.class?.id
? this.classService.getById(person?.class?.id)
: of(null);
return combineLatest([of(person), class$]);
})
).subscribe(/*...*/);
错误TS2322: Observable is not assignable to Observable
我认为是self-described。
我有一个场景,我需要使用 Angular
中的 RxJs
进行顺序 API 调用,我已经完成了,但我遇到了这个空错误。为了调用第二个 api,我将从第一个 API 接收 id
,它可以是 null
或 undefined
。所以我想要的如果 id 不可用我将 return of(null)
否则将 return 响应。但是有一些打字错误。以下是我到目前为止所做的。
of(personId).pipe(
take(1),
switchMap((personId: string) => {
return this.personService.getById(personId).pipe(
concatMap((person: Person) => {
const classId = person?.class?.id || null;
let class$ = of(null);
if (classId) {
class$ = this.classService.getById(classId); // Will return Observable<Class>
}
return combineLatest([of(person), class$])
})
)
}),
tap(([person, class]) => {
console.log('Person: ', person);
console.log('Clas: ', class);
})
).subscribe()
class$ = this.classService.getById(classId);
在这条线上我遇到了'TS2322: Observable is not assignable to Observable`
关于如何解决这个问题有什么建议吗?还可以改进此代码吗?
你可以用这一行替换条件逻辑
let class$= classId?this.classService.getById(classId):of(null)
this.classService.getById
返回的 observable 与 of(null)
返回的不同,因此您不能用它重新分配 class$
变量。
不过,只需使用三元运算符定义 class$
即可轻松解决您的问题,如下所示:
const class$ = person?.class?.id ? this.classService.getById(classId) : of(null);
首先这个of(personId)
看起来很奇怪。
为什么不呢:
this.personService.getById(personId).pipe(
concatMap((person: Person) => {
const class$ = person?.class?.id
? this.classService.getById(person?.class?.id)
: of(null);
return combineLatest([of(person), class$]);
})
).subscribe(/*...*/);
错误TS2322: Observable is not assignable to Observable
我认为是self-described。