gpt4 book ai didi

angular - 如果我发现自己一直在订阅另一个订阅中的内容,我应该怎么做?

转载 作者:太空狗 更新时间:2023-10-29 19:27:08 25 4
gpt4 key购买 nike

我有一个用例,我试图从表单中收集信息(使用 Angular2 中的 Materialize)并将其添加到 firebase。关于用户的一些信息已经存在于所述 firebase 中,我希望数据库中的新条目包含一个指向数据库中其他地方已经存在的节点('users/:userId')的键。

在我的例子中,具体来说,我发现自己必须从我的身份验证服务中获取当前用户,等待那个可观察对象发布 userInfo,这样我就可以在 firebase 中查询具有相同电子邮件地址的用户,获取该用户的 key 用户,并将该 key 作为新对象的一部分传递给数据库。

也许这段代码有助于阐明:

createMatchObj(result: any){
let {matchUrlBound, athlete1NameBound, athlete2NameBound, tournamentNameBound, locationBound, tournamentDateBound, giStatusBound, genderBound, ageClassBound, rankBound, weightBound} = result;
let matchDeets = new MatchDetails(tournamentNameBound, locationBound, new Date(tournamentDateBound), athlete1NameBound, athlete2NameBound, weightBound, rankBound, matchUrlBound, genderBound, giStatusBound === 'true', ageClassBound);
let moves: Array<MoveInVideo> = new Array<MoveInVideo>();
this.as.getCurrentUser()
.takeUntil(this.ngUnsubscribe).subscribe(userInfo => {
console.log("got into getCurrentUser");
this.db.getNodeIdFromEmail(userInfo.email).on("child_added", snapshot=>{
let match = new Match(matchDeets, snapshot.key, moves);
return Observable.of(match); //this clearly doesn't work
});
});
//but a return statement here wouldn't wait for the subscriptions
}

在提交表单时调用 createMatchObj 方法以及对数据库服务的调用:

  submitFormAndReturnToMain(){
let values = this.getValues();
let match = this.createMatchObj(values).subscribe(result=>{
console.log(match);
this.db.addMatchToDb(match);
this.router.navigate(['landing']);
});
}

举例说明: image of database structure

不过,我怀疑这个问题可以泛化得非常广泛,而且令人惊讶的是,之前似乎并没有在堆栈溢出时以这种方式被问到过:

像上面这样的嵌套订阅的最佳做法是什么?到目前为止,我一直在避免学习 switchMap() ,因为我几乎不了解一般的 observables。 switchMap() 之类的东西是答案吗?

如果需要,很乐意提供更多信息:

最佳答案

在非常严格的术语中,您可以将 switchMap 或 mergeMap 视为 promise.then。您可能想要返回一个 Observable 而不是来自 createMatchObj 的订阅。这里的问题是首先使用 mergeMap/switchMap 传递 userInfo,然后你需要将 this.db.getNodeIdFromEmail(userInfo.email) 从回调转换为 Observable

createMatchObj(result: any){
let {matchUrlBound, athlete1NameBound, athlete2NameBound, tournamentNameBound, locationBound, tournamentDateBound, giStatusBound, genderBound, ageClassBound, rankBound, weightBound} = result;
let matchDeets = new MatchDetails(tournamentNameBound, locationBound, new Date(tournamentDateBound), athlete1NameBound, athlete2NameBound, weightBound, rankBound, matchUrlBound, genderBound, giStatusBound === 'true', ageClassBound);
let moves: Array<MoveInVideo> = new Array<MoveInVideo>();
return this.as.getCurrentUser().switchMap(userInfo => {
console.log("got into getCurrentUser");
return Rx.Observable.create(obs=>{
this.db.getNodeIdFromEmail(userInfo.email).on("child_added", snapshot=>{
let match = new Match(matchDeets, snapshot.key, moves);
obs.next(match);
});
});
});
//but a return statement here wouldn't wait for the subscriptions
}


submitFormAndReturnToMain(){
let values = this.getValues();
let match = this.createMatchObj(values).takeUntil(this.ngUnsubscribe).subscribe(result=>{
console.log(match);
this.db.addMatchToDb(match);
this.router.navigate(['landing']);
});
}

您可以在订阅前将 takeUntil 保留到最后。

关于angular - 如果我发现自己一直在订阅另一个订阅中的内容,我应该怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48135082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com