Javascript 如何从可观测数据中正确获取阵列数据?

Javascript 如何从可观测数据中正确获取阵列数据?,javascript,angular,firebase,google-cloud-firestore,angularfire2,Javascript,Angular,Firebase,Google Cloud Firestore,Angularfire2,我需要两个函数来返回所有数据以及特定的过滤数据,但我的构造是错误的。下面是我想要的,但我返回的是订阅,而不是数组: allItems() { var collectionAll: AngularFirestoreCollection<Item> = this._afs.collection<Item>('items'); var itemArray$: Observable<Item[]> =

我需要两个函数来返回所有数据以及特定的过滤数据,但我的构造是错误的。下面是我想要的,但我返回的是订阅,而不是数组:

   allItems() {

      var collectionAll: AngularFirestoreCollection<Item> =
         this._afs.collection<Item>('items');

      var itemArray$: Observable<Item[]> =
         collectionAll.valueChanges();

      // Returns Subscription but I need Items[]
      return itemArray$.subscribe(items => {
         return items;
      })
   }

   specificItems(name: string) {

      var collectionSpecific: AngularFirestoreCollection<Item> =
         this._afs.collection<Item>('items', ref =>
            ref.where('name', '==', name));

      var itemArray$: Observable<Item[]> =
         collectionSpecific.valueChanges();

      // Returns Subscription but I need Items[]
      return itemArray$.subscribe(items => {
         return items;
      })
   }
我还认为它需要是一个异步函数,但subscribe函数不返回承诺


而且我甚至不确定在什么时候我会从Firestore实际收取读取计数…?

如果您想要承诺,您需要使用toPromise将可观察到的内容转换为承诺:


观测值非常强大,你应该保持原样

allItems = this._afs.collection<Item>('items').valueChanges();
在模板中,您可以简单地使用异步管道读取数据:

<div *ngFor="let items of allItems | async">...</div>
出于几个原因,这是使用Angular最有效的方法,因此请尽快尝试学习,因为Angular=RxJS基本上是不正确的,当然,但它显示了您在Angular中需要多少RxJS

在不同的位置声明下面的模型,以便可以重用相同的模型

在服务层中声明以下方法

这只是一个示例,您可以根据需要更新此方法和模型


对我来说,观察到的可能的重复仍然是一种思想上的转变;它们可以用来添加到吗?在我的示例中,我打算创建一个项目数组,然后在用户会话期间添加到该数组中,获取所有名为“ABC”的项目,然后添加“DEF”等。。使用可观测数据是否可能?正如Andrei所指出的,更改为承诺将获得阵列,但可能我的方法不正确?可观测值是增强的承诺,承诺可以做什么,它们可以做得更好。任何告诉你其他情况的人都不理解可观测性。他的解决方案只是返回一个承诺,而不是返回一个可观察的。使用异步关键字可以。但是考虑到JS只有一个线程,这意味着您在调用期间会阻止它。我不会说这是一种不好的做法,但绝对不是一种好的做法。@LovetoCode哦,对于firebase的读取计数,一个请求=+1。你每个月大概有3万次手术,所以你应该没事!安德烈,这确实回答了我的问题,所以我接受了你的回答。我想我可能有一个错误的方法,促使我首先回答玛丽安娜的问题。谢谢你。
<div *ngFor="let items of allItems | async">...</div>
  export class EmployeeRoster {
        RosterDate: Date;
        EmployeeId: number;
        RosterDayName: string;
        ProjectId: number;
        ShiftId: number;
        ShiftTime: string;
        ShiftColor: string;
        IsOnLeave: boolean;
    }
      GetSavedEmployeeData(empIds: EmployeeIdlistToRoster[], sDate: string, eDate: string): Observable<EmployeeRoster[]> { 
        let empIdsValue = '';
        if (empIds !== null && empIds.length > 0) {
          empIds.forEach(function (em) {
            empIdsValue += em.EmpId + ',';
          });
        }

        //How to pass value as a parameter
        const paramsdsf = new HttpParams()
          .set('empIds', empIdsValue)
          .append('sDate', sDate)
          .append('eDate', eDate);
        return this.http.get<EmployeeRoster[]>(apiUrl, { params: paramsdsf });
      }