Angular等到订阅完成后再给其他函数值。

问题描述 投票:0回答:2

我有以下功能

文件:subcategory.service.ts

getSubCategoriesById(inp_subCatid: String): Observable<any>{
  this.getSubCategoriesList().snapshotChanges().pipe(
    map(changes =>
     changes.map(c =>
      ({ key: c.payload.key, ...c.payload.val() })
     )
    )
  ).subscribe(subCategories => {
    subCategories.filter(function (subCat) {
     return subCat.id == inp_subCatid;
   });
});

我正在调用下面文件中的顶级函数

文件:subcategory.page.ts

this.SubCategoryService.getSubCategoriesById(subCatid).subscribe((subCategories: any) => {
  this.subCat = subCategories ;
})

我得到的问题是我得到了以下错误信息:ERROR TypeError. "this.SubCategoryService.getSubCategorysById(...)is undefined"。"this.SubCategoryService.getSubCategorysById(...)是未定义的"

我想从文件 "subcategory.service.ts "中获取加载时的数据,希望有人能帮助我。

javascript angular asynchronous subscribe
2个回答
0
投票

你的方法应该是这样的。

getSubCategories(inp_subCatid: string): Observable<any> {
  return this.getSubCategoriesList().snapshotChanges().pipe(
    map(changes => changes.map(c => 
        ({ key: c.payload.key, ...c.payload.val() })
      ).filter((subCat) => subCat.id === inp_subCatid)
    ));
}

然后你就可以像这样使用。

this.subCategoryService.getSubCategories(subCatid)
  .subscribe(subCategories => this.subCat = subCategories);

如果我对你的方法有正确的理解的话 我觉得你使用的是firebase... 如果是这样的话 在你调用之后 this.yourService.getSubCategories(subCatid) 第一次,您的订阅将保持激活状态,这样您的子类别将因数据库的每次变化而更新,即使您改变了 subCatid,之前的数据库查询将是活的。为了避免这种情况的发生,我建议你只采取一个发射的 snapshotChanges():

getSubCategories(inp_subCatid: string): Observable<any> {
  return this.getSubCategoriesList().snapshotChanges().pipe(
    // finish the subscription after receiving the first value
    take(1),
    map(changes => changes.map(c => 
        ({ key: c.payload.key, ...c.payload.val() })
      ).filter((subCat) => subCat.id === inp_subCatid)
    ));
}

0
投票

谢谢你

如果我想过滤一个特定的数据,比如 "id"?

getSubCategoriesbyId(inp_subCatid): Observable<any>{
  this.getSubCategoriesList().snapshotChanges().pipe(
    map(changes =>
      changes.map(c =>
        ({ key: c.payload.key, ...c.payload.val() })
      )
    )
  ).subscribe(subCategories => {
     subCategories.filter(function (subCat) {
    return subCat.id == inp_subCatid;
  });
  });
}

然后得到过滤后的数据

this.yourService.getSubCategoriesbyId(subCatid)
  .subscribe(subCategories => console.log(subCategories));
© www.soinside.com 2019 - 2024. All rights reserved.