Me enfrento a un problema, cuando trato de guardar mis datos en firebase, algunos de los campos no se guardan, mientras que tengo los valores correctos en la consola.
Estoy tratando de almacenar un objeto de comida que tiene la identificación y el nombre del usuario actual como atributo y los valores del formulario, para los valores del formulario está bien, pero no para los datos del usuario actual.
Aquí está mi función: food.service.ts
private foodCollection: AngularFirestoreCollection<FoodView>; ... addFood(food: FoodView) { this.loadingService.present(); let foodToAdd: FoodView = food; this.authService.getUserData().subscribe((u) => { foodToAdd.cookerName = u.displayName; foodToAdd.cookerId = u.uid; }); console.log(foodToAdd); return this.foodCollection.add(foodToAdd).then(() => this.loadingService.dismiss());}La función donde está la consulta: de AngularFireStoreCollection
/** * Add data to a collection reference. * * Note: Data operation methods are done on the reference not the query. This means * when you update data it is not updating data to the window of your query unless * the data fits the criteria of the query. */ add(data: T): Promise<DocumentReference<T>>;aquí es donde se usa mi función: add-food.page.ts
addFood() { this.setFood(); this.foodService.addFood(this.food).then(() =>{ this.presentAlert(); this.tagList = []; this.ingredientList = []; this.addFoodForm.reset(); } ); }mi servicio de autenticación donde obtengo datos de usuario:
getUserData() { return this.afs.doc<User>(`users/${this.getUserId()}`).valueChanges(); } esta es mi salida en la consola para mi objeto de comida antes de intentar almacenarlo en firebase: 
Y este es el mismo objeto en firebase pero sin la información necesaria: 
Como puede ver, los campos cookerName y cookerId no están disponibles.
Estoy usando Ionic 5 con Angular 11.
Cómo puedo arreglarlo ?
Gracias por tu ayuda
Finalmente resolví esto, el problema estaba en mi servicio de carga que tiene una función asíncrona (presentar y descartar), al eliminar this.loadingService.present() y this.loadingService.dismiss() funciona bien
Para resolver este problema, eliminé la función de la clase LoadingService . Como eran asincrónicos, la devolución de llamada de Firebase con el valor de comida actualizado correcto se realizó antes de que se actualizara el valor de comida.
He cambiado esto esto:
addFood(food: FoodView) { this.loadingService.present(); let foodToAdd: FoodView = food; this.authService.getUserData().subscribe((u) => { foodToAdd.cookerName = u.displayName; foodToAdd.cookerId = u.uid; }); console.log(foodToAdd); return this.foodCollection.add(foodToAdd).then(() => this.loadingService.dismiss());}para esto:
async addFood(food: FoodView) { this.authService.getUserData().subscribe((u) => { food.cookerName = u.displayName; food.cookerId = u.uid; }); return this.foodCollection.add(food); }y funciona bastante bien, solo tengo que cambiar como funciona mi servicio de carga