我尝试将从订阅中获得的数据传递到一个局部变量中,但每次i console.log(the local object)
时它都返回undefined,但当I console.log(data from the subscription)
时数据正确返回。我需要局部变量中的对象来访问html模板中的参数。
我在一个角服务中有这个方法
export class MachinesService {
apiURL: string = environment.apiURL + 'Machine/';
constructor(private http: HttpClient) { }
public getMachine(id: number): Observable<IMachine> {return this.http.get<IMachine>(this.apiURL + ${id})}}
在应用程序组件中,我从路由器快照接收id,并使用该id调用服务方法,我尝试了不同的方法。
首先是这个:
export class MachineViewComponent implements OnInit {
redirect: string | null = null;
machine?: IMachine ;
machineId? : number;
constructor(
private route: ActivatedRoute,
private machinesService : MachinesService,
private router : Router ) { }
ngOnInit(): void {
this.machineId = parseInt( this.route.snapshot.paramMap.get("id")!); this.machinesService.getMachine(this.machineId!).subscribe(data => { this.machine = data; })
}
}
然后是:
export class MachineViewComponent implements OnInit {
redirect: string | null = null;
subscription: Subscription[] = [];
machine?: IMachine ;
machineId? : number;
constructor(
private route: ActivatedRoute ,
private machinesService : MachinesService,
private router : Router ) { }
ngOnInit(): void {
this.machineId = parseInt( this.route.snapshot.paramMap.get("id")!);
this.RefreshData();
}
RefreshData() {
this.subscription.push(this.machinesService.getMachine(this.machineId!).subscribe(data =>{
this.machine = data;
}))
};
}
也是这样:
export class MachineViewComponent implements OnInit {
redirect: string | null = null;
machine?: IMachine ;
machineId? : number;
constructor(
private route: ActivatedRoute ,
private machinesService : MachinesService,
private router : Router ) { }
ngOnInit(): void {
this.machineId = parseInt( this.route.snapshot.paramMap.get("id")!);
let GetMachineAsync = async (machineId : number): Promise<any> =>{
const machinex = await
this.machinesService.getMachine(this.machineId!).subscribe(machine => {
return machine});
return machinex
};
GetMachineAsync(this.machineId).then(x => {console.log(x); this.machine = x}) } }
然后我就没办法了
每次我记录这个。机器是未定义的,但来自订阅的机器元素是正确的。
同样,当我在网络中查找http响应时,对象也在这里。
我做错了什么?
1条答案
按热度按时间pftdvrlh1#
虽然最初的问题可能是由名称中的拼写错误引起的,但代码仍然存在细微的缺陷。例如,如果您限制网络连接,并强制HTTP请求花费更长时间,您的代码可能会失败。此处的代码仅在HTTP请求发生得太快以至于模板还没有机会呈现时才有效。
我会将
machine
设为Observable
,然后在模板中使用异步管道订阅它:现在,
machine
在被提取之前是无法访问的。