Javascript Angular 8在subscribe中等待rest api响应
在component.ts中,我有一个调用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) {
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的位置更新