开发者问题收集

在 Observable 中返回承诺

2017-08-07
6830

我有一个使用 angularfire2 的 Angular 应用,我正在使用一种方法从 firebase 中的几个不同表中删除一些信息。

removeTeam(key: string) {
    const dataToRemove = {};
    dataToRemove[`teams/${key}`] = null;

    this.findMembersInTeam(key).subscribe(members => {
      members.forEach(member => {
        dataToRemove[`members/${member}/teams/${key}`] = null;
      });

      this.sdkDB.update(dataToRemove);
    });
  }

所以这个方法的作用基本上是删除 /teams/,并且对于团队中的每个成员,删除团队,因此删除 /members//teams/。

我所做的是检索团队中的成员列表,因为这是一个可观察对象,所以在订阅中我编写了“查询”并使用 this.sdkDB.update(dataToRemove)

最后一个方法返回一个 Promise,这就是我想要作为方法 removeTeam 的结果返回的,有没有办法做到这一点?

谢谢

2个回答

如果 sdkDB 返回一个 Observable,则导入 rxjs/add/operator/mergeMap 并使用 flatMapmergeMap (flatMap 只是 mergeMap 的一个别名)而不是 subscribe

这将组合您的可观察流。

removeTeam(key: string) {
    const dataToRemove = {};
    dataToRemove[`teams/${key}`] = null;

    return this.findMembersInTeam(key)
        .flatMap(members => {
            members.forEach(member => {
                dataToRemove[`members/${member}/teams/${key}`] = null;
            });

            return this.sdkDB.update(dataToRemove);
        })
        .toPromise();
  }
Lansana Camara
2017-08-07

尝试一下:

import 'rxjs/add/operator/toPromise';

// ...

removeTeam(key: string) {
    const dataToRemove = {};
    dataToRemove[`teams/${key}`] = null;
    return this.findMembersInTeam(key)
               .toPromise()
               .then(members => {
                    members.forEach(member => {
                        dataToRemove[`members/${member}/teams/${key}`] = null;
                    });
                    return this.sdkDB.update(dataToRemove);
                });
}
Faly
2017-08-07