RXJS - 等到两个可观察量都完成
RXJS - waiting until both observables are complete
我是 RXJS 的新手,我正在编写一个验证函数,其中可能会弹出 2 个模式(一个接一个),并且用户必须确认他们可以违反验证规则。
我是这样称呼它的:
this.isValidAssignment(x,y,z).subscribe(result => {
if (!result) { return; }
...do something...
});
isValidAssignment(x, y, z): Observable<boolean> {
if (x === y){
of(false)
}
if (x < y) {
return this.confirmIncorrectAssignment();
}
if (y !== z) {
return this.confirmIncorrectAssignment();
}
return of(true)
}
// returns true if they click yes and false if they click no
confirmIncorrectAssignment(): Observable<boolean> {
const dialogRef = this.dialog.open(ConfirmCancelModalComponent);
return dialogRef.afterClosed();
}
我的问题是如果第一次确认执行它会继续并且 returns 一个 Observable 并且它永远不会检查第二次验证。
RXJS 中确保用户确认两种模式的最佳方式是什么?我只希望它在两个 observables 都完成并且它们都单击“是”时发出 true 。
我设法找到了使用 RXJS forkJoin 和 map 运算符的解决方案。我更新后的代码如下所示。
isValidAssignment(x, y, z): Observable<boolean> {
let o1: Observable<boolean> = of(true);
let o2: Observable<boolean> = of(true);
if (x === y){
return of(false)
}
if (x < y) {
o1 = this.confirmIncorrectAssignment();
}
if (y !== z) {
o2 = this.confirmIncorrectAssignment();
}
return forkJoin([o1, o2]).pipe(map((x) => x[0] && x[1]));
}
因为我将 observable 初始化为 true,所以如果不以其他方式分配给模态的 return,它将发出 true。假设两个验证都被触发,一旦它们都完成,forkJoin 会将其通过管道传输到地图中,然后地图将使用布尔逻辑来 return true 或 false。
我是 RXJS 的新手,我正在编写一个验证函数,其中可能会弹出 2 个模式(一个接一个),并且用户必须确认他们可以违反验证规则。
我是这样称呼它的:
this.isValidAssignment(x,y,z).subscribe(result => {
if (!result) { return; }
...do something...
});
isValidAssignment(x, y, z): Observable<boolean> {
if (x === y){
of(false)
}
if (x < y) {
return this.confirmIncorrectAssignment();
}
if (y !== z) {
return this.confirmIncorrectAssignment();
}
return of(true)
}
// returns true if they click yes and false if they click no
confirmIncorrectAssignment(): Observable<boolean> {
const dialogRef = this.dialog.open(ConfirmCancelModalComponent);
return dialogRef.afterClosed();
}
我的问题是如果第一次确认执行它会继续并且 returns 一个 Observable 并且它永远不会检查第二次验证。
RXJS 中确保用户确认两种模式的最佳方式是什么?我只希望它在两个 observables 都完成并且它们都单击“是”时发出 true 。
我设法找到了使用 RXJS forkJoin 和 map 运算符的解决方案。我更新后的代码如下所示。
isValidAssignment(x, y, z): Observable<boolean> {
let o1: Observable<boolean> = of(true);
let o2: Observable<boolean> = of(true);
if (x === y){
return of(false)
}
if (x < y) {
o1 = this.confirmIncorrectAssignment();
}
if (y !== z) {
o2 = this.confirmIncorrectAssignment();
}
return forkJoin([o1, o2]).pipe(map((x) => x[0] && x[1]));
}
因为我将 observable 初始化为 true,所以如果不以其他方式分配给模态的 return,它将发出 true。假设两个验证都被触发,一旦它们都完成,forkJoin 会将其通过管道传输到地图中,然后地图将使用布尔逻辑来 return true 或 false。