Javascript Angular 8在subscribe中等待rest api响应

Javascript Angular 8在subscribe中等待rest api响应,javascript,angular,typescript,angular8,Javascript,Angular,Typescript,Angular8,在component.ts中,我有一个调用api并处理响应的方法。我得到一个空数组,因为它没有在订阅时等待 disp(): String[] { let scores: String[] = []; this.assessmentService.getPrograms().subscribe( (res: AssessmentResponse[]) => { res.map( function (t) {

在component.ts中,我有一个调用api并处理响应的方法。我得到一个空数组,因为它没有在订阅时等待

disp(): String[] {
    let scores: String[] = [];
    this.assessmentService.getPrograms().subscribe(
      (res: AssessmentResponse[]) => {
        res.map(
          function (t) {
            const body = `{id: ${t.id}, name: "${t.name}"}`;
            scores.push(body);
          })
        return scores;
      },
      (err: HttpErrorResponse) => {
        if (err.error instanceof Error) {
          console.log("Client-side error occured.");
        } else {
          console.log("Server-side error occured.");
        }
      });
    console.log("returned");
    return scores;
  }
我想存储disp返回的数组

 programList$ = observableOf(this.disp);
然后我使用programList$设置选项的值,我发布了一小段代码,因为它有多个选项卡

 tabs: TabType[] = [
    {
      label: 'Assign Program',
      fields: [
        {
          fieldGroupClassName: 'display-flex',
          fieldGroup: [
            {
              className: 'flex-1',
              key: 'campaign',
              type: 'select',
              templateOptions: {
                label: 'Campaign',
                placeholder: 'Select Campaign',
                // description: 'Campaign Name',
                required: true,
                options: this.programList$,
这是我的服务电话

 public  getPrograms(): Observable<AssessmentResponse[]> {

         return this.http.get(this.endpoint,this.headers.httpOptions)
         .pipe(map((data: EmbeddedAssessmentsResponse) => data._embedded.programs));          
    }
public getPrograms():可观察{
返回this.http.get(this.endpoint、this.headers.httpOptions)
.pipe(地图((数据:嵌入式评估响应)=>data.\u embedded.programs));
}

PS:我不熟悉angular和typescript,非常感谢您的帮助。

如果您的
programList$
是可观察的,则您的
disp()
方法应返回可观察的:
programList$=this.disp()

disp():可观察{
返回此.assessmentService.getPrograms()管道(
map((res:AssessmentResponse[])=>{
返回res.map(t=>`{id:${t.id},名称:${t.name}}`);
}),
catchError((错误:HttpErrorResponse)=>{
if(err.error instanceof error){
log(“发生客户端错误”);
}否则{
log(“发生服务器端错误”);
}
归还([]);
});
);

由于订阅回调是异步执行的,如果在执行回调之前尝试读取数组,则数组将为空

只需在组件中创建一个属性
programList
,并在执行subscribe回调时分配从API返回的数据,然后调用一个函数来创建
选项卡
数组。您可以尝试以下操作:

programList: string[];
tabs: TabType[];

disp(): void {
    this.assessmentService.getPrograms().subscribe(
      (res: AssessmentResponse[]) => {
        let scores: String[] = [];
        res.map(
          function (t) {
            const body = `{id: ${t.id}, name: "${t.name}"}`;
            scores.push(body);
          })
        this.programList = scores;
        this.createTabsArray();
      },
      (err: HttpErrorResponse) => {
        if (err.error instanceof Error) {
          console.log("Client-side error occured.");
        } else {
          console.log("Server-side error occured.");
        }
      });
}

createTabsArray(): void {
    this.tabs = [
    {
      label: 'Assign Program',
      fields: [
        {
          fieldGroupClassName: 'display-flex',
          fieldGroup: [
            {
              className: 'flex-1',
              key: 'campaign',
              type: 'select',
              templateOptions: {
                label: 'Campaign',
                placeholder: 'Select Campaign',
                // description: 'Campaign Name',
                required: true,
                options: this.programList,
                ...
                ...
                }
            ...
            ...
            }]
}

如果要等待调用subscribe,则代码不起作用。调用disp()的位置在哪里?从调用disp的位置更新