javascript - 迭代 observable.forkJoin 以处理多个数据库的 crud (API)
问题描述
我需要在我的主数据库中插入用户信息,一旦它被插入(成功),我必须在多个数据库(API)中插入类似的信息。我正在使用Observable.forkJoin()
我的主数据库,因为多个表中有多个插入。
以下是我的代码:
save(){
Observable.forkJoin([
this.userService.saveUser(this.username),
this.userService.saveRoles(this.username, this.roles),
this.userService.saveGroups(this.username, this.groups)
]).subscribe(data=>{
if(data.length == 3){
this.saveInMultipleDatabases();
}
},
err => console.error("error while adding user ",err)
);
}
saveInMultipleDatabases(){
for(let i=0;i<this.allDatabases;i++){
Observable.forkJoin([
this.userService.saveUser(this.username),
this.userService.saveRoles(this.username, this.roles),
this.userService.saveGroups(this.username, this.groups)
]).subscribe(data=>{
console.log(data);
},
err => console.error("error while adding user ",err)
);
}
}
现在我这里有几个问题
- 这里是
observable.forkJoin()
在多个表中插入数据的更好方法。 observation.forkJoin
在插入主数据库之后,在其subscribe()
功能中使用并对其进行迭代以实现在多个数据库中的插入是一种更好的方法,就像我在这里所做的那样。- 迭代可观察对象或承诺处理所有数据库的请求/响应是更好的方法吗?
- 我也必须为用户更新/删除场景实施类似的方法,所以我想知道它是否是更好的方法来实现这一点。
任何帮助,将不胜感激。
更新
角度服务中我的主数据库的插入代码:
saveUser(username){
return window.appnamespace.DBAPI.insertUser(username);
}
saveRoles(username, roles){
let promise;
roles.forEach(role => {
promise = window.appnamespace.DBAPI.insertRoles(role, username);
});
return promise;
}
saveGroups(username, groups){
let promise;
groups.forEach(grp => {
promise = window.appnamespace.DBAPI.insertGroups(grp.value, username);
});
return promise;
}
解决方案
我认为重要的问题是需要同时发生什么。根据您的描述,您似乎想等到所有记录都存储在主数据库中。只有在那之后,您才想将数据存储在其他数据库中,并且您可能不在乎以什么顺序。
所以使用Observable.forkJoin()
很好,我只是将它与concatMap
或mergeMap
取决于你想要做什么。然后我猜所有内部的 Observable 都可以合并。
Observable.forkJoin([obs1, obs2, obs3])
.concatMap(responses => {
const observables = [];
for (let i=0; i<this.allDatabases; i++) {
observables.push(saveUser(...), saveRoles(...), ...);
}
return Observable.merge(Observable.from(responses), ...observables);
})
.subscribe({
next: response => console.log(response),
error: err => console.log(`It's broken`, err),
complete: () => console.log('All done'),
});
这当然很大程度上取决于你想做什么,但我希望你能明白这一点。
推荐阅读
- javascript - 如何将 React 道具从父母传递给孩子,再传递给另一个孩子?
- python - 具有跳过连接的层的 Tensorflow He 初始化程序
- javascript - 发布所见即所得的文本编辑器
- c# - 随机平滑方向变化
- javascript - PWA 中“不可阻挡”的服务工作者?
- hibernate - 如何使用 Hibernate 从 Observable 列表中删除多个项目
- javascript - 点击高亮div
- highcharts - 我可以在 Highcharts 柱形图中为日期时间 x 轴启用滚动条吗
- javascript - Angular httpClient GET 请求未到达服务器
- code-coverage - 如何让 gcovr 报告未测试文件的 0%?