Использование await внутри forkjoin TS - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь получить новый результат на основе старого результата.Поэтому, когда конкретным параметром в моем доминирующем вызове является X, он должен вызывать другую функцию, но моя текущая проблема заключается в том, что область продолжает работать, что приводит к потере нового параметра.

Код выглядит следующим образом:

export class DashboardGuard implements CanActivate { 


 public canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { 
    this.logger.info(DashboardGuard::canActivate());
    return Observable.create((subscribe: Subscriber<boolean>): void => { 


    Observable.forkJoin(
                this.mapSettingsService.fetch(),
                this.userSettingsService.fetch(),
                this.mapFenceService.fetch(),
                this.markersMotesService.fetch(),
                this.markersStaticsService.fetch()
            ).subscribe((result: [MapSettings, UserSettings, MapFenceGroup[], MarkersMotes, MarkersStatics]): void => {

                // Fetch loaded motes and statics
                const mapSettings: MapSettings = result[0];
                const userSettings: UserSettings = result[1];
                const mapFenceGroups: MapFenceGroup[] = result[2];
                let markersMotes: MarkersMotes = result[3];
                const markerStatics: MarkersStatics = result[4];

                for (let i in markersMotes.items) {
                    if (markersMotes.items[i].longitude === 0 || markersMotes.items[i].latitude === 0) {
                        // Here I want to call another fetch with the data from the previous fetches, but the program scope
                        // should wait until it finished those fetches.
                        //  Example of fetch:
                        Observable.forkJoin(
                            this.markersMotesService.newfetch(markersMotes.items[i].macAddress),
                        ).subscribe((result: [MarkersNolocations]): void => {
                            const newResult: MarkersNolocations = result[0];
                            if (newResult.missedCounter > 0) {
                                markersMotes.items[i].latitude = 10;
                                markersMotes.items[i].longitude = 10;
                            }
                        });

                    }
                }
})

Я получаю, что forkjoin - это отличный вариант для получения всех звонков, но как насчет звонков внутри этого?

Любая помощь будет принята с благодарностью!

Привет,

Брэм

1 Ответ

0 голосов
/ 11 декабря 2018

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

https://www.learnrxjs.io/operators/transformation/switchmap.html

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

let itemsNeedingLocation: SomeClassHere[] = [];
Observable.forkJoin(
                this.mapSettingsService.fetch(),
                this.userSettingsService.fetch(),
                this.mapFenceService.fetch(),
                this.markersMotesService.fetch(),
                this.markersStaticsService.fetch()
            ).switchMap((result: [MapSettings, UserSettings, MapFenceGroup[], MarkersMotes, MarkersStatics]): void => {

                // Fetch loaded motes and statics
                const mapSettings: MapSettings = result[0];
                const userSettings: UserSettings = result[1];
                const mapFenceGroups: MapFenceGroup[] = result[2];
                let markersMotes: MarkersMotes = result[3];
                const markerStatics: MarkersStatics = result[4];
                let obs: Observable[] = [];

                for (let i in markersMotes.items) {
                    if (markersMotes.items[i].longitude === 0 || markersMotes.items[i].latitude === 0) {
                        itemsNeedingLocation.push(markersMotes.items[i]);
                        obs.push(this.markersMotesService.newfetch(markersMotes.items[i].macAddress));
                    }
                }
                return Observable.forkJoin(obs);
            }).subscribe((result: [MarkersNolocations]): void => {
                itemsNeedingLocation.forEach((item, index) => {
                    if (result[index].missedCounter > 0) {
                        item.latitude = 10;
                        item.longitude = 10;
                    }
                });
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...