Как правильно связать rxjs 6 наблюдаемых? - PullRequest
0 голосов
/ 12 октября 2018

Какие-нибудь предложения, как это можно переписать в стиле цепочки обещаний?:

this.apiService.sendPutRequest('/api/users/activate', usrObj).pipe(
        map(() => {
            return this.apiService.sendGetRequest('/api/users/' + this.currentUserId).pipe(
                map(data => {
                    return this.setActiveUser(data).pipe(
                        map(() => {
                            return this.apiService.sendGetRequest('api/tasks/user/' + this.currentUserId).pipe(
                                map(tasks => {
                                    return this.taskService.setCurrentUserTasks(tasks);
                                })
                            );
                        })
                    );
                })
            );
        })
    );

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

Вы можете использовать switchMap для обработки наблюдаемых и tap для обработки побочных эффектов.И вам нужно подписаться, потому что это холодно наблюдаемый

Для обработки ошибок используйте catchError для всех запросов

this.apiService.sendPutRequest('/api/users/activate', usrObj).pipe(
    catchError(err=> this.errorHandler(err)),
    switchMap(() => this.apiService.sendGetRequest('/api/users/' + this.currentUserId)
        .pipe(catchError(err=> this.errorHandler(err)))
    ),
    tap(data => this.setActiveUser(data)),
    switchMap(() => this.apiService.sendGetRequest('api/tasks/user/' + this.currentUserId)
        .pipe(catchError(err=> this.errorHandler(err)))
    ),
    tap(tasks => this.taskService.setCurrentUserTasks(tasks))
).subscribe()
0 голосов
/ 12 октября 2018

Используйте один pipe для вашей проблемы.Просто запятую разделяйте различные цепочечные операторы, такие как map, switchMap, mergeMap, tap и т. Д.

this.apiService.sendPutRequest('/api/users/activate', usrObj).pipe(
  switchMap((results) => this.apiService.sendGetRequest('/api/users/' + this.currentUserId)),
  tap((results) => this.setActiveUser(data)),
  switchMap(() => this.apiService.sendGetRequest('api/tasks/user/' + this.currentUserId)),
  tap((results) => this.taskService.setCurrentUserTasks(tasks))
);

Упрощенный: используйте map, если вы просто хотите преобразовать значение без каких-либоasync api вызывает и передает его другому оператору или подписке, tap, если вы просто хотите перехватывать значения между ними без преобразования (например, для регистрации).И switchMap для отправки дополнительных вызовов API.

0 голосов
/ 12 октября 2018

используйте SwitchMap для этого.

mainApiCall.pipe(
    switchMap(result=>secondApiCall(result)),
    switchMap(resultFromSecondApiCall=>thirdApiCall(resultFromSecond))
...
and so on
)
...