Я пытаюсь использовать async await
в Angular 10
, чтобы сначала загрузить список пользователей из моей серверной базы данных (Spring Boot с MariaDB) с помощью http-запроса, а затем, после загрузки списка, отфильтровать этот список для одного указанного c пользователя. Но почему-то loadUsers()
продолжает выполняться дважды, как вы можете видеть в итоговом журнале в конце моего сообщения.
Вот как я ожидал, что мой код будет работать:
загрузить всех пользователей -> console.log список всех моих пользователей (a)
отфильтруйте список пользователей, а затем console.log этого одного отфильтрованного пользователя -> ( б)
Но вместо а) -> б) я получаю а) -> б) -> а). Где сначала а) пусто, потому что HTTP-запрос еще не был завершен, затем б), который, следовательно, также пуст, поскольку пользователи еще не загружены, а затем снова а) после загрузки пользователей?
ngOnInit() {
this.loadOwner();
}
loadOwner = async () => {
const result = await this.loadUsers() // I'm not doing anything with the result, maybe that's the reason?
// do something else here after users loading completes
this.user= this.users.filter(user => user.id === this.product.userId)[0]
console.log("The user: " + this.user) // b) (should get logged as last)
}
loadUsers() {
this._update.currentUsers$.subscribe(users => {
this.users = users;
console.log("my users: " + this.users) // a) (should get logged first)
})
}
Это последний журнал, который я получаю с а) -> б) -> а) структурой:
результат
Фильтрация и HTTP-запрос работают, у меня уже был ожидаемый конечный результат, но я хотел иметь более чистый код с asyn c await, вместо того, чтобы вкладывать функцию loadUser в область подписки loadUsers. Есть и другие вещи, которые мне нужно сделать после этого, и это становится все более и более вложенным.