В настоящее время я пытаюсь показать данные сотрудника после того, как он вошел в свою учетную запись, я могу получить данные сотрудника из бэкэнда по его имени пользователя, и я могу записать его в консоль, но когда я назначаю данные другой переменной типа любой я консолью регистрирую эту переменную, и в результате я получил неопределенность.
мой служебный файл:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { environment } from 'src/environments/environment';
import { Employee } from '../Employee';
@Injectable({
providedIn: 'root'
})
export class EmployeeService {
private apiServerUrl = environment.apiBaseUrl;
constructor(private http: HttpClient) { }
getEmployee(username: String): Observable<any> {
return this.http.get<any>(`${this.apiServerUrl}/getbyuser/${username}`);
}
}
файл employee.component.ts
import { HttpErrorResponse } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { AuthService } from '../services/auth.service';
import { EmployeeService } from '../services/employee.service';
@Component({
selector: 'app-employee',
templateUrl: './employee.component.html',
styleUrls: ['./employee.component.css']
})
export class EmployeeComponent implements OnInit {
constructor(public auth: AuthService,private api: EmployeeService) { }
employeeObj : any;
ngOnInit(): void {
let username = localStorage.getItem('username');
if (username != null) {
this.getEmployee(username);
console.info(this.employeeObj); // it shows undefined
}
}
getEmployee(username: String) {
this.api.getEmployee(username).subscribe(
(data) => {
this.employeeObj = data;
console.info(this.employeeObj); // it shows the informations i received from my backend
}, (error: HttpErrorResponse) => {
console.info(error);
}
)
}
}
результат :
Это связано с асинхронным выполнением кода, из-за которого переменная регистрируется в журнале до фактического присвоения значения. У этой проблемы может быть несколько решений, но все зависит от того, что вы на самом деле хотите делать со своим кодом.
Если вы используете только данные из employeeObj
в HTML после его извлечения, вы можете просто проверить, не определено ли значение, и оно будет автоматически обновлено, когда данные закончат заполнение.
Вы также можете просто делать все, что вам нужно, с вашим employeeObj
внутри вашей getEmployee
функции.
В противном случае вы можете использовать обещания и асинхронно/ожидание.
ngOnInit(): void {
let username = localStorage.getItem('username');
if (username != null) {
this.getEmployee(username);
console.info(this.employeeObj);
}
}
async getEmployee(username: String) {
this.employeeObj = await this.api.getEmployee(username).toPromise()
.catch((error: HttpErrorResponse) => {
console.info(error);
});
}