【问题标题】:Iterating over observable.forkJoin to handle crud for multiple databases (API)迭代 observable.forkJoin 以处理多个数据库的 crud (API)
【发布时间】:2018-07-05 13:31:42
【问题描述】:

我需要在我的主数据库中插入用户信息,一旦插入(成功)我必须在多个中插入类似的 数据库(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() 是在多个表中插入数据的更好方法吗?
  • 在插入主数据库后,在其subscribe() 函数中使用observation.forkJoin 并对其进行迭代是更好的方法吗? 像我在这里做的那样实现在多个数据库中的插入。
  • 迭代可观察对象或承诺处理所有数据库的请求/响应是更好的方法吗?
  • 我也必须为用户更新/删除场景实施类似的方法,所以我想知道是否是更好的实施方法。

任何帮助将不胜感激。

更新

在 Angular 服务中为我的主数据库插入代码:

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

【问题讨论】:

  • 您是否尝试从前端应用程序中保持多个数据库同步...?!
  • 抛开这是否是正确的服务器端更新顺序,但肯定有更好的方法可以让您的代码更简单,但我无法在您的代码中看到数据库是如何迭代的
  • @maxime1992: 不应该是异步的
  • @FanCheung:实际上我还没有为此编写代码,但我正在尝试为多个数据库实现这样的功能,但是我已经为我的主数据库编写了代码,我可以向您展示
  • @SKy 这不是我的意思。为什么要重现对多个数据库的所有调用?感觉真的,真的很奇怪。

标签: javascript angular promise rxjs observable


【解决方案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'),
  });

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

【讨论】:

  • 感谢您的回答。是的,实际上一旦它被插入到主数据库中,那么我不在乎它是否插入到多个服务器中。我只想记录它成功的地方和失败的地方。
  • 是的,这正是我所做的
  • 我想在一个数组或 obj 中记录它工作的地方以及所有操作完成后失败的地方
  • 你能解释一下concatMap和mergeMap吗,因为我对RxJs不太了解。我只用过forkJoin
  • 好吧,那就更复杂了。您需要为每个saveUser(...) 使用catchError,这样第一个错误就不会处理链,然后可能是toArray()subscribe() 之前收集所有结果。
猜你喜欢
  • 1970-01-01
  • 2019-07-11
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
相关资源
最近更新 更多