Javascript 不调用forkJoin内的日志行

Javascript 不调用forkJoin内的日志行,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,我有办法 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,

我有办法

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');
   }
private getData(){
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])=>{
log('fork join');
this.list1=res1作为ProjectDto[];
this.list2=res2作为数组;
this.list3=res3作为数组;
setItem('a',JSON.stringify(this.list1));
setItem('b',JSON.stringify(this.list2));
setItem('c',JSON.stringify(this.list3));
log('set items');
});
console.log('Completed');
}
方法被调用。但是,
forkJoin
中的两个日志行根本没有被调用。所以我不知道我是否成功地从服务中获取数据。我使用rxjs 5.5.6

更新:


我的错,我只是发现它们实际上是打印出来的,因为服务花了很长时间。因此,问题变成了如何同步打印日志。现在他们先打印
开始
完成

你应该把
控制台.log('Completed')在订阅内部,因为订阅是
异步的
,发生在稍后的时间点

但是如果您希望结构保持不变,您可以像编程一样执行
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);
   }
import{take}来自'rxjs/operators';
....
私有异步getData():承诺{
log('Begin');
const sub1=this.http['url1'].get();
const sub2=this.http['url2'].get();
const sub3=this.http['url3'].get();
const[res1,res2,res3]=等待forkJoin([sub1,sub2,sub3]).pipe(take(1)).toPromise();
log('fork join');
this.list1=res1作为ProjectDto[];
this.list2=res2作为数组;
this.list3=res3作为数组;
setItem('a',JSON.stringify(this.list1));
setItem('b',JSON.stringify(this.list2));
setItem('c',JSON.stringify(this.list3));
log('set items');
console.log('Completed');
返回承诺。解决(真实);
}

subscribe的第三个参数将接受回调,并在流完成时调用

 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'));
const sub=forkJoin([sub1,sub2,sub3])。subscribe([res1,res2,res3])=>{
log('fork join');
this.list1=res1作为ProjectDto[];
this.list2=res2作为数组;
this.list3=res3作为数组;
setItem('a',JSON.stringify(this.list1));
setItem('b',JSON.stringify(this.list2));
setItem('c',JSON.stringify(this.list3));
},null,()=>console.log('complete');
您可以使用对象签名(
next
complete
)来避免
null