Подскажите, пожалуйста, как правильно реализовать следующую логику:
У меня имеется три массива, которые содержат в себя данные, которые необходимо отправить на бекенд.
Массивы могут быть пустые.
Мне нужно обновить страницу только после того, как все запросы из этих массивов вернут ответ.
Сначала я реализовал это следующим образом:
forkJoin(
forkJoin(
newWidgets.map(widget => this.dashboardService.addDashboardWidget(widget))
),
forkJoin(
existingWidgets.map(widget => this.dashboardService.updateDashboardWidget(widget))
),
forkJoin(
deletedWidgets.map(widget => this.dashboardService.removeDashboardWidget(widget))
)
).subscribe(() => {
this.router.navigateByUrl(`/questionnaires/${this.packageId}/dashboard`);
});
Но такой подход не подходит по двум причинам:
1) Если один из массивов будет пустым, то сабскрайб никогда не сработает.
2) Меня в принципе смущает эта вложенность forkJoin`ов друг в друга
В итоге конечное решение я придумал такое:
let newWidgetsRequest: Observable<any> = new Observable();
let existingWidgetsRequest: Observable<any> = new Observable();
let deletedWidgetsRequest: Observable<any> = new Observable();
let allRequest = [];
if (newWidgets.length > 0) {
newWidgetsRequest = forkJoin(newWidgets.map(widget => this.dashboardService.addDashboardWidget(widget)));
allRequest = allRequest.concat(newWidgetsRequest);
}
if (existingWidgets.length > 0) {
existingWidgetsRequest = forkJoin(existingWidgets.map(widget => this.dashboardService.updateDashboardWidget(widget)));
allRequest = allRequest.concat(existingWidgetsRequest);
}
if (deletedWidgets.length > 0) {
deletedWidgetsRequest = forkJoin(deletedWidgets.map(widget => this.dashboardService.removeDashboardWidget(widget)));
allRequest = allRequest.concat(deletedWidgetsRequest);
}
forkJoin(allRequest).subscribe((result) => {
this.router.navigateByUrl(`/questionnaires/${this.packageId}/dashboard`);
});
Но тут прям вообще получились какие-то костыли, которые я даже до конца не понимаю, почему они работают.
На RxJS явно так не пишут.
Моя проблема в том, что я даже не знаю, что именно искать в документации, ибо не могу сформулировать свой вопрос без демонстрации кода.