Итерация по observable.forkJoin для обработки crud для нескольких баз данных (API) - PullRequest
0 голосов
/ 05 июля 2018

У меня есть требование для вставки информации о пользователе в мою основную базу данных, и как только она будет вставлена ​​(успешно), я должен вставить похожее в базы данных (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() и выполнить итерацию добиться вставки в несколько баз данных, как я делаю здесь.
  • Это лучший подход для перебора наблюдаемого или обещания обработать запрос / ответ для всех баз данных.
  • Я также должен реализовать аналогичный подход для пользовательских сценариев обновления / удаления, поэтому я хотел бы узнать, является ли это лучшим способом реализовать это или нет.

Любая помощь будет оценена.

UPDATE

Код вставки для моей основной базы данных в угловой службе:

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 голосов
/ 05 июля 2018

Я думаю, что важный вопрос заключается в том, что должно происходить одновременно. Из вашего описания кажется, что вы хотите подождать, пока все записи не будут сохранены в первичной базе данных. Только после этого вы хотите хранить данные в других базах данных, и вам, вероятно, все равно, в каком порядке.

Так что с использованием Observable.forkJoin() хорошо, я бы просто связал его с concatMap или mergeMap в зависимости от того, что вы хотите сделать. Тогда все внутренние Обсерватории могут быть объединены, я думаю.

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'),
  });

Это, конечно, во многом зависит от того, что вы хотите сделать, но я надеюсь, что вы поймете.

...