首页 > 解决方案 > 迭代 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)
        );
    }
}

现在我这里有几个问题

任何帮助,将不胜感激。

更新

角度服务中我的主数据库的插入代码:

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;
}

标签: javascriptangularpromiserxjsobservable

解决方案


我认为重要的问题是需要同时发生什么。根据您的描述,您似乎想等到所有记录都存储在主数据库中。只有在那之后,您才想将数据存储在其他数据库中,并且您可能不在乎以什么顺序。

所以使用Observable.forkJoin()很好,我只是将它与concatMapmergeMap取决于你想要做什么。然后我猜所有内部的 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'),
  });

这当然很大程度上取决于你想做什么,但我希望你能明白这一点。


推荐阅读