Итак, основываясь на обсуждении, я сделал очень простой пример.Суть в том, что вам нужно связать ваш первый ответ (который дает вам data.id
) и использовать его для непосредственного вызова второй функции БД (вместо использования 2 переменных).Причина, как я упоминал ранее, заключается в том, что вы делаете асинхронный вызов БД для получения вашего ID.Это произойдет в какой-то момент позже, и только тогда вы сможете позвонить, используя этот идентификатор.В вашем текущем коде вы просто вызываете функцию this.db.collection('Users').doc( data.id )..}
немедленно, синхронно , которая не будет работать.
Я не использовал flatMap
, поскольку у вас нетвнутренняя наблюдаемая (как мне показалось, случай)
import { of, Observable } from 'rxjs';
import { mergeMap,map } from 'rxjs/operators';
/**
* Assume this is the response of the
* this.db.collection('Users', ref => ref.where(
* 'email', '==', 'EXAMPLE' )).snapshotChanges()
* i.e an observable output
* and data_id is equivalent to data.id in your
*/
const source = of({data_id: 0}, {data_id:1 },{data_id:2});
/**
* Now if the data_id is the index to this array, in your case : you need the
* data.id to make a call to the `DB` to retrieve the trainees
*/
const db2 = ['a','b','c'];
//use map to get the ID you need and then directly call the db to retrieve trainees, in this case it will return you another observable
const example = source.pipe(map((e,i) => of(test(e.data_id))));
// subscribe to the observable and do your action
const subscribe = example.subscribe((val) => console.log(val));
function test(value) {
return (db2[value]);
}
Stackblitz для вас, чтобы поиграть.