Ожидание, наблюдаемое в угловой функции

#angular #observable

Вопрос:

У меня есть служба, в которой я получаю данные, отправляя sql-запрос;

   getList(model:sqlModel):Observable<apiResultModel<sqlResultModel>>{
    return this.http.post<apiResultModel<sqlResultModel>>(this.apiUrl,JSON.stringify(model),httpOptions);
  }
 

Моя служба работает без сбоев. но в компоненте, который я хочу использовать для этих входящих данных, я должен ждать, пока данные поступят.

  openInputPopup():void{
    const resModel = this.getSqlResult();--this should not go to the bottom line before it is completed 
    console.log('res',resModel);
    const modal = this.inputPopup.create({
      nzTitle: 'Component Settings',
      nzStyle:{'top':'20px', 'width':'60%'},
      nzContent: FormPopupModalComponent,
      nzViewContainerRef: this.viewContainerRef,
      nzComponentParams: {   
        sqlResModel:resModel 
      },
      nzOnOk: () => new Promise(resolve => setTimeout(resolve, 1000))      
    });
    modal.afterClose.subscribe(a=>{
      var el = document.getElementById('popDeneme');
      this.popValue = modal.componentInstance.inputId;
    });
  }


  getSqlResult() :sqlResultModel{
    this.sqlModel.dbSourceId=1;
    this.sqlModel.limitperPage=1;
    this.sqlModel.pageNum=1;
    this.sqlModel.query="SELECT [CODE],[DEFINITION_] FROM [TEST].[dbo].[PRODUCTS]"
    var res = new sqlResultModel();
   
    this.sqlService.getList(this.sqlModel).subscribe(
      i=>{        
        res = i.Resu<
        console.log('ok');
      }
    );

    return res;  --There should be no return before the getlist() function above is completed. Since getlist() is not complete, it returns the initial value and it doesn't work for me.  
  }
 

что ты предлагаешь мне сделать? Я знаю, что это небольшой момент, но я новичок в кодировании, пожалуйста, помогите

Комментарии:

1. Другого способа нет … вы звоните на сервер, поэтому вам нужно подождать, других альтернатив нет.

2. На самом деле вопрос больше в том, как код может быть выполнен после того, как наблюдаемое разрешится. Вам следует посмотреть на операторы RxJS switchMap и mergeMap

Ответ №1:

вы можете использовать операторы Rxjs, как упоминалось ранее, но вы также можете конвертировать в promise и использовать await, как это :

верните это вместо этого return this.sqlService.getList(this.sqlModel).toPromise()

и используйте его вот так :

 async openInputPopup():void{
const resModel = await this.getSqlResult();
// your code 
}