Estou usando o Angular 6 e meu banco de dados é Firebase. Agora tento mostrar os nomes de cada sala de acordo com sua construção. Por exemplo:
Building A
Room 1
Room 2
Building B
Room 1
Room 2
Mas toda vez que tento, ele mostra todos os nomes dos prédios primeiro, e só depois os nomes dos quartos. Isso é o que eu tenho agora:
Building A
Building B
Room 1
Room 2
Descobri que isso acontece porque forEach
fica pulando a subscribe
função.
Tentei usar promise
e await
, mas não funciona. Talvez porque eu usei de forma errada? Não tenho certeza de como usar de promise
maneira correta.
async loadData(){
this.navigationService.user
.subscribe( user => {
console.log(user);
this.user = user;
this.navigationService.getBuildings(this.user.orgId)
.subscribe( building => {
this.navMasterBuilding = [];
this.buildings = building;
this.buildings.forEach( async building2 => {
this.completeBuildingId = building2.completeBuildingId;
this.buildingName = building2.buildingName;
console.log(building2.buildingName);
await new Promise ((resolve, reject) => {
this.navigationService.getLocation(this.user.orgId, this.completeBuildingId)
.subscribe(location => {
console.log('room' + location);
this.navMasterLocation = [];
});
resolve();
});
});
});
});
}
Tentei atrasar usando setTimeout, mas ainda não funciona.
Array.forEach
só funciona com funções síncronas. Mude-o para usar a for...of
sintaxe que funciona. Ao lado disso, você resolve
o Promise
antes da chamada para getLocation
terminar e o código ser subscribe
executado. Altere o código para chamar resolve
dentro do getLocation.subscribe
.
for(const building2 of buildings) {
console.log(building2.buildingName);
await new Promise ((resolve, reject) => {
this.navigationService.getLocation(this.user.orgId, this.completeBuildingId)
.subscribe(location => {
console.log('room' + location);
this.navMasterLocation = [];
resolve();
});
});
}
Observe que isso pode ser simplificado para:
for(const building2 of buildings) {
console.log(building2.buildingName);
const location = await this.navigationService.getLocation(this.user.orgId, this.completeBuildingId).toPromise();
console.log('room' + location);
this.navMasterLocation = [];
}
Observe também que não tenho certeza de por que você usa em this.completeBuildingId
vez de uma variável local. Visto que ele é sobrescrito a cada iteração, isso parece um pouco inútil para mim.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras