forEach()首先触发,直到它完成之后,firebase工作

时间:2018-04-06 19:14:03

标签: angular typescript firebase google-cloud-firestore

我正在使用棱角分明的棱角分明的材料和火焰底座。 我在调试时发现了这个问题。

  

预期

我的期望是forEach项目进入searchCategory方法并执行this.categorySubscription = this.storeService.doc$(路径).subscribe();

但是,现在在我的代码中,forEach一直有效,直到它完成后,执行firestore订阅。

因此,当用户添加类别时,如果服务器中没有类别,则区分新类别。否则,它会区分添加为已存在的类别用户。

  

过程

过程是,首先,类别被放入类别列表中,并且它与forEach一起使用。当第一个类别进入searchCategory方法并使用firestore查询在服务器上搜索类别时。 在订阅中,我们可以获得一个数据,如果它为空 - 意味着服务器上没有类别 - 或者不是。因此,如果数据为null,那么我将使用添加查询,否则使用更新查询。

如果您提供任何建议或提示,可能会非常有帮助。谢谢。

这是我的代码

this.storeInfo.value['categoryChips'].forEach(category => {
      this.searchCategory(category);
}

// ...

searchCategory(category) {
   this.categorySubscription = this.storeService.doc$(`categories/${category.name}`).subscribe(
  data => {
    if (data === null || data === undefined) {
      // add a new category

      this.addCategory(category);
      this.getRelStore(category.name);
    }
      else {
      // update          
      // this.test2(category, path, data['id']);
      // this.categorySubscription.unsubscribe();
      // this.categoryNum++;
      // this.getRelStore(category.name);
    }
  }
);
}

//...
//get related stores as an array
  getRelStore(name) {
    this.categorySubscription.unsubscribe();
    this.loadRel = this.storeService.doc$(`categories/${name}/relatedStore/store`).subscribe(
  data => {

    // there's no related store.
    if (data !== null && data !== undefined) {
      let tempRelatedStores;
      tempRelatedStores = data['name'];
      tempRelatedStores.push(this.storeName);
      this.addRelStore(name, tempRelatedStores);
    } else { // there are related stores already
      this.storeService.set(`categories/${name}/relatedStore/store`, {
        name: this.storeName
      });
    }
  });

1 个答案:

答案 0 :(得分:0)

我用.take(1)解决了。 我在.take(1)前添加了subscribe()。 它发送了一个我期望的项目。