Я пытаюсь получить данные из пожарного магазина, а затем преобразовать данные в массив. новый массив должен быть наблюдаемым - PullRequest
0 голосов
/ 10 марта 2020

У меня есть служба, в которой я написал метод для извлечения данных из friestore.

метод должен возвращать наблюдаемое. Затем данные преобразуются и сохраняются в другой переменной. Я хочу создать наблюдаемую из обновленной переменной. Как я могу go об этом.

Я пытался создать наблюдателя, используя Subjects, ReplaySubjects и observables, но я предполагаю, что что-то упустил. Но я получаю следующие ошибки:

core. js: 5847 Ошибка: Uncaught (в обещании): TypeError: Невозможно прочитать свойство 'asObservable' из неопределенного

и

core. js: 5847 ОШИБКА TypeError: Невозможно прочитать свойство 'next' из undefined следующий код.

import { BehaviorSubject, Observable, of, Subscriber, ReplaySubject, Subject} from 'rxjs';

export class ProductsService {

  public List : Product[] = [];
  public productListObservable :  Subject<Product[]>;

  private products(): Observable<Product[]> {

      //returns an observable of type Product[]

      this.firestoreService.getProductsList().subscribe((doc) =>{

        //Fetch data from firestore and 
        //create the new list with updated id's

        this.List = doc.docs.map(prodItem =>{
          let x = prodItem.data()
          let test = {};
          test['id']=prodItem.id;
          test['name'] = x['ProductName'];
          test['category'] = x['ProductCategory'];
          test['tags']= x['ProductTags'];
          test['specs'] = x['ProductSpecs'];
          test['inclusions'] = x['ProductInclusion'];
          test['shortDetails'] = x['ProductShortDetails'];
          test['description'] = x['ProductDescription'];
          test['pictures'] = x['ProductImages'];

          return test;
        })
        this.productListObservable.next(this.List);
     })

    return this.productListObservable.asObservable();

  }


public getProducts(): Observable<Product[]> {
    //var test = this.products();
    //test.subscribe(x =>{
    //  console.log(x);
    //})
    return this.products();
  }

In Component. html

   ngOnInit() {
    this.productsService.getProducts().subscribe(product => this.products = product);
  }

1 Ответ

0 голосов
/ 10 марта 2020

Ошибки, которые вы получаете, заключаются в том, что вы никогда не создавали объект объекта. Вы только заявили об этом. Вы можете изменить

public productListObservable :  Subject<Product[]>;

на

public productListObservable = new Subject<Product[]>();

В качестве альтернативы, способ формулировки вопроса, похоже, вам даже не нужен этот предмет вообще. Если вы просто используете его для возврата к Observable, вы можете вместо этого использовать rx js s map в вашей существующей Observable. Что-то вроде:

private products(): Observable<Product[]> {

  //returns an observable of type Product[]

  return this.firestoreService.getProductsList().pipe(map(doc => {

    //Fetch data from firestore and 
    //create the new list with updated id's

    this.List = doc.docs.map(prodItem =>{
      let x = prodItem.data()
      let test = {};
      test['id']=prodItem.id;
      test['name'] = x['ProductName'];
      test['category'] = x['ProductCategory'];
      test['tags']= x['ProductTags'];
      test['specs'] = x['ProductSpecs'];
      test['inclusions'] = x['ProductInclusion'];
      test['shortDetails'] = x['ProductShortDetails'];
      test['description'] = x['ProductDescription'];
      test['pictures'] = x['ProductImages'];

      return test;
    });
    return this.List;
 });

}
...