angular - RXJS - 等到两个 observables 都完成
问题描述
我是 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();
}
我的问题是,如果第一次确认执行它会继续并返回一个 Observable 并且第二次验证永远不会被检查。
RXJS 中确保用户确认两种模式的最佳方法是什么?我只希望它在两个可观察对象都已完成并且它们都单击“是”时发出 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,如果没有另外分配给模态的返回,它将发出 true。假设两个验证都被触发,一旦它们都完成,forkJoin 会将其通过管道传输到地图中,然后使用布尔逻辑返回 true 或 false。
推荐阅读
- javascript - Angular2 - 在组件类中创建多个变量声明与直接在模板中使用对象
- reactjs - React Router Dom 5.1.2 — 选项卡支持
- amazon-web-services - 通过 Lambda 函数获取数据并将其保存为 AWS 存储中的 JSON
- google-apps-script - 如何在 Google Apps 脚本中创建一个循环?
- python - 后缀:从python脚本读取传入邮件时权限被拒绝错误
- typescript - 具有可变属性名称的 emberjs glimmer 对象 set()
- node.js - 我网站中的 xss-clean 中间件在一个页面上工作,但在另一个页面上不工作
- tfs - Azure devop 服务器用户收不到电子邮件通知
- tcp - 通过 TCP 流式传输 RTSP
- swiftui - 有没有办法将按钮放在 SwiftUI 单元格视图中?