Как подписаться на некоторые наблюдаемые запросы? - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть несколько методов http, которые возвращают наблюдаемые данные. Все методы размещены в сервисе:

class Service {

    requests1(): Observable<any> {
        return http...;
    }

    requests2(): Observable<any> {
        return http...;
    }

    requests3(): Observable<any> {
        return http...;
    }
}

Где-то в приложении я использую это как:

Service.request1().subscribe((data) => {
    console.log(data);
});

Во вложенном компоненте также вызовите другой запрос:

Service.request2().subscribe((data) => {
   console.log(data);
});

Как соединить их с помощью forkJoin из разных частей приложения?

forkJoin(request1, request2) {}

Проблема в том, что один request1 вызывает из родительского компонента, другой request2 внутри дочернего.

Мне нужен joinFork чтобы убедиться, что они завершены?

У меня есть идея перечислить все наблюдаемые, как:

export let request1Obs: Observable<any>;
export let request2Obs: Observable<any>;
export let request3Obs: Observable<any>;

Затем на месте, где я вызываю сервер для использования:

request1Obs = Service.requests1();
request2Obs = Service.requests2();
request3Obs = Service.requests3();

И потом дочерний A component, чтобы использовать это:

ngOninit() {
    request1Obs.subscribe(() => {});    
}

И еще один дочерний B component, чтобы использовать это:

ngOninit() {
    request2Obs.subscribe(() => {});    
}

И в родительском компоненте:

ngOnInit() {
   forkJoin(request1Obs, request2Obs).subscribe((data) => {
   // All requestes were finished in application
});
}

Ответы [ 3 ]

1 голос
/ 26 апреля 2020

Для правильного использования forkjoin вы должны использовать его в одном источнике. Либо вы должны позвонить в ваши услуги от родителей или от ребенка. После этого вы можете поделиться данными между ними после завершения forkjoin.

Короче говоря, в родительском компоненте сделайте следующее:

response1:any
response2:any
forkJoin(Service.request1(), Service.request2())
    .subscribe(Response =>
response1= Response[0];
response2= Response[1];
 );

После этого вы можете отправить данные (response2) вашему дочернему компоненту несколькими пути.

1 голос
/ 26 апреля 2020

Вы можете использовать shareReplay , HTTP-запросы будут выполняться только один раз, после чего результат forkJoin будет кэшироваться для любой новой подписки во всем приложении, если служба является одиночной (просто добавьте {provideIn: 'root'}) .

@Injectable({provideIn: 'root'})
class Service {
    getRequestsData() {
        return forkJoin([...allRequests]).pipe(shareReplay(1))
    }
}
0 голосов
/ 26 апреля 2020
forkJoin(Service.request1(), Service.request2())
    .subscribe(([response1, response2]) => console.log(`response1: ${respone1}, response2: ${response2}`));
...