我需要在主数据库中插入用户信息,一旦成功插入,我必须在多个数据库中插入类似的信息
数据库(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;
}
答案 0 :(得分:1)
我认为重要的问题是什么需要同时发生。从您的描述看来,您想要等待直到所有记录都存储在主数据库中。只有在那之后,您才想将数据存储在其他数据库中,并且您可能不在乎顺序是什么。
因此,使用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'),
});
这当然取决于您要做什么,但我希望您能明白这一点。