Возврат всех полей из документа в виде массива из облака Firebase Firestore - ioni c 4 - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь вернуть все поля из документа из Firebase cloud Firestore. Проблема возникает, когда я sh хочу сохранить этот документ в виде массива на моей странице для использования. В любом случае, я пытаюсь, я не могу взять массив за пределами метода .subscribe (). вне подписки массив не определен. Я предполагаю, что я не понимаю процесс в машинописи.

quiz.service.ts

 export interface Quiz{
 q1: string;
 q2: string;
 q3: string;
 q4: string;

 }
 @Injectable({
   providedIn: 'root'
 })
 export class QuizService {
   quizss: Quiz[];
   quiz: Quiz;
   private quizCollection: AngularFirestoreCollection<Quiz>;
   private quizs: Observable<Quiz[]>;

   constructor(db: AngularFirestore) {
     this.quizCollection = db.collection<Quiz>('quiz');

     this.quizs = this.quizCollection.snapshotChanges().pipe(
       map(actions =>{
           return actions.map(a => {
             const data = a.payload.doc.data();
             const id = a.payload.doc.id;
             return{ id, ...data};
           });
       })
     );
    }

   getQuiz(id){
     return this.quizCollection.doc<Quiz>(id).valueChanges().pipe(
       map(response => response)
     );
   }
 }

Я получаю неопределенное со следующим в console.log в ngOnInit:

 ngOnInit() {
     this.route.queryParams.subscribe((res) => {
       id = res.name;
     });
     answerNumber= 0;
     this.question2 = this.quizService.getQuiz(id);
     console.log("question pull "+ this.question2[0]);  
 }
 returnQuiz( answerNumber) {
     this.quizService.getQuiz(id)
       .subscribe(res =>{
       this.quiz = res;
       let newPoint = {
         q1: this.quiz.q1,
         q2: this.quiz.q2,
         q3: this.quiz.q3,
         q4: this.quiz.q4,
       }
       this.question1[0] = newPoint.q1;
       this.question1[1] = newPoint.q2;
       this.question1[2] = newPoint.q3;
       this.question1[3] = newPoint.q4;

       return this.question1;
     });
  }

Я также пробовал это с той же ошибкой в ​​журнале консоли, возвращая неопределенное:

 ngOnInit() {
     this.route.queryParams.subscribe((res) => {
       id = res.name;
     });
     answerNumber= 0;
     this.quizService.getQuiz(id)
       .subscribe(res =>{
       this.quiz = res;
       let newPoint = {
         q1: this.quiz.q1,
         q2: this.quiz.q2,
         q3: this.quiz.q3,
         q4: this.quiz.q4,
       }
       this.question1[0] = newPoint.q1;
       this.question1[1] = newPoint.q2;
       this.question1[2] = newPoint.q3;
       this.question1[3] = newPoint.q4;
     });
      console.log("question pull "+ this.question1[0]);
 }

1 Ответ

0 голосов
/ 18 февраля 2020

это из-за асинхронного поведения. console.log не подписан, поэтому console.log выполняется до установки значения this.question1 move console.log в методе боковой подписки. как это

`
ngOnInit() {
    this.route.queryParams.subscribe((res) => {
        id = res.name;
        answerNumber= 0;
        this.quizService.getQuiz(id)
        .subscribe(res =>{
            this.quiz = res;
            let newPoint = {
               q1: this.quiz.q1,
                 q2: this.quiz.q2,
                 q3: this.quiz.q3,
                 q4: this.quiz.q4,
               }
               this.question1[0] = newPoint.q1;
               this.question1[1] = newPoint.q2;
               this.question1[2] = newPoint.q3;
               this.question1[3] = newPoint.q4;
               console.log("question pull "+ this.question1[0]);
           });
         });
     }`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...