在angular 5中的ngoninit之后之后要运行一个函数该怎么办

时间:2018-08-21 10:27:31

标签: angular angular-lifecycle-hooks

这是关于生命周期挂钩的。我的要求是在页面初始化后立即运行一个功能。我用过ngAfterViewInit()。但它不等待从ngoninit()找到的数组。

export class Parent2Component implements OnInit , DoCheck {

constructor(private getHTTP: HttpCallService) { }

eventResults: any;
apiParam: any = ['posts', 'albums', 'comments', 'photos', 'users', 
'todos', 'posts', 'albums', 'comments', 'photos', 'users', 'todos',
'posts', 'albums', 'comments', 'photos', 'users', 'todos', 'posts', 
'albums', 'comments', 'photos', 'users', 'todos'];
 resultArray: any = [];
 finalArray: any = [];
 displayedColumns: string[] = ['resourceId'];
 finalObject: any = [];
 demoObject: any = [];



getCatagory(index) {
  this.demoObject = this.demoData.resources.webcast[index];
  console.log('this.demoObject' , this.demoObject);

}

getEventsData() {
  for (let index = 0; index < this.apiParam.length; index++) {
    this.getHTTP.getData('https://jsonplaceholder.typicode.com/' + 
  this.apiParam[index])
      .subscribe((response) => {
        this.eventResults = response;
        console.log('All Data of ' + this.apiParam[index] + 'is ' + 
  this.eventResults);
      });
  }
 }
getDemo() {
this.demoObject = this.demoData.resources.webcast[0];
this.getHTTP
  .getData('https://jsonplaceholder.typicode.com/posts' )
  .subscribe((respData) => {

      console.log('================Resp init====================');
      console.log(respData);
    });

 }


getObs() {
const apiRoot = 'https://jsonplaceholder.typicode.com/';
const urls = [];
for (let i = 0; i < this.apiParam.length; i++) {
  urls.push(apiRoot + this.apiParam[i]);
}
of(...urls).pipe(
  concatMap((url: string) => this.getHTTP.getData(url)))
  .subscribe((result) => {
    this.resultArray.push(result);
    // console.log('this.resultArray', this.resultArray);

    if (this.resultArray.length === this.apiParam.length) {
      for (let index = 0; index < this.resultArray.length; index++) {
        // console.log(this.apiParam[index]);
        this.finalObject = { [this.apiParam[index]]: 
  this.resultArray[index] };
        this.finalArray.push(this.finalObject);
      }
    }
  });
console.log('========this.finalArray============================');
console.log(this.finalArray);
// console.log('====================================');
}

ngOnInit() {
console.log('ONinit');
this.getDemo();
}

ngDoCheck() {
 console.log('AfterONinit');
 this.getObs();
}
}
  • 如果我使用的是ngDocheck(),代码将进入无限循环.ngViewinit不适合这种情况。请帮帮我

1 个答案:

答案 0 :(得分:0)

如我所见,您需要从ngonit调用的getDemo成功/完成并调用getObs()。只需将getDemo的成功回调内的getObs调用为:-

getDemo() {
this.demoObject = this.demoData.resources.webcast[0];
this.getHTTP
  .getData('https://jsonplaceholder.typicode.com/posts' )
  .subscribe((respData) => {

      console.log('================Resp init====================');
      console.log(respData);
      this.getObs(); // Add this here and you will get your expected behaviour of getting the result array before calling getObs
    });

 }