#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
}