遍历observable.forkJoin以处理多个数据库(API)的Crud

时间:2018-07-05 13:31:42

标签: javascript angular promise rxjs observable

我需要在主数据库中插入用户信息,一旦成功插入,我必须在多个数据库中插入类似的信息 数据库(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;
}

1 个答案:

答案 0 :(得分:1)

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

因此,使用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'),
  });

这当然取决于您要做什么,但我希望您能明白这一点。