在Observable中回复承诺

时间:2017-08-07 13:53:28

标签: angular firebase promise rxjs angularfire2

我使用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);
    });
  }

所以这样做,基本上就是remove / teams /,而且,对于团队中的每个成员,都要删除团队,所以删除/ members // teams /.

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

执行它

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

由于

2 个答案:

答案 0 :(得分:4)

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

这结合了您的可观察流。

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();
  }

答案 1 :(得分:1)

试试这个:

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);
                });
}