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
。