Строки лога внутри forkJoin не называются - PullRequest
3 голосов
/ 27 марта 2020

У меня есть метод.

private getData() {
     console.log('Begin');
     const sub1 = this.http['url1'].get();
     const sub2 = this.http['url2'].get();
     const sub3 = this.http['url3'].get();
     const sub = forkJoin([sub1, sub2, sub3]).subscribe(([res1, res2, res3]) => {
         console.log('fork join');
         this.list1 = res1 as ProjectDto[];
         this.list2 = res2 as Array<MyTest>;
         this.list3 = res3 as Array<MyTest>;
         sessionStorage.setItem('a', JSON.stringify(this.list1));
         sessionStorage.setItem('b', JSON.stringify(this.list2));
         sessionStorage.setItem('c', JSON.stringify(this.list3));
         console.log('set items');
     });
     console.log('Completed');
   }

Метод был вызван. Однако две строки журнала внутри forkJoin не были вызваны вообще. Так что я не знаю, получаю ли я данные из сервиса успешно. Я использую rx js 5.5.6.

ОБНОВЛЕНИЕ:

Мое плохое, я только что обнаружил, что они были фактически распечатаны, поскольку обслуживание заняло очень много времени. Таким образом, возникает вопрос, как печатать журналы синхронно. Теперь они печатают Begin и Completed первыми.

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Третий параметр подписки примет обратный вызов и будет вызван после завершения потока

 const sub = forkJoin([sub1, sub2, sub3]).subscribe(([res1, res2, res3]) => {
     console.log('fork join');
     this.list1 = res1 as ProjectDto[];
     this.list2 = res2 as Array<MyTest>;
     this.list3 = res3 as Array<MyTest>;
     sessionStorage.setItem('a', JSON.stringify(this.list1));
     sessionStorage.setItem('b', JSON.stringify(this.list2));
     sessionStorage.setItem('c', JSON.stringify(this.list3));
 },null,()=>console.log('complete'));
0 голосов
/ 28 марта 2020

Вы должны поместить console.log('Completed'); внутри подписки, так как подписка asynchronous и происходит в более поздний момент времени.

Но если вы хотите, чтобы структура оставалась прежней, вы можете сделать promise как программирование.

import { take } from 'rxjs/operators';
....
private async getData(): Promise<boolean> {
     console.log('Begin');
     const sub1 = this.http['url1'].get();
     const sub2 = this.http['url2'].get();
     const sub3 = this.http['url3'].get();
     const [res1, res2, res3] = await forkJoin([sub1, sub2, sub3]).pipe(take(1)).toPromise();
     console.log('fork join');
     this.list1 = res1 as ProjectDto[];
     this.list2 = res2 as Array<MyTest>;
     this.list3 = res3 as Array<MyTest>;
     sessionStorage.setItem('a', JSON.stringify(this.list1));
     sessionStorage.setItem('b', JSON.stringify(this.list2));
     sessionStorage.setItem('c', JSON.stringify(this.list3));
     console.log('set items');
     console.log('Completed');
     return Promise.resolve(true);
   }
...