请求的行为:
我想创建一个AngularService来检查某个文档是否存在,并根据结果更新全局变量。
当前状态
该功能成功检查文档的存在。它还会在if / else语句中更新全局变量。
问题
即使第一部分运行良好,也总是返回“ undefined”。
我该如何解决?与功能范围有关吗?
我的服务:
{{1}}
答案 0 :(得分:1)
followDoc.get()是一个返回promise的异步函数。为了返回更新的this.followState,您必须等待then
一种方法是使用异步/等待
async checksFollow(followingID: string, followerID: string): boolean {
const followDoc =
this.angularFirestore.collection(`users/${followingID}/following`).doc(followerID).ref;
return followDoc.get().then((doc) => {
if (doc.exists) {
this.followState = true;
} else {
this.followState = false;
}
return this.followState;
});
}
在代码的另一部分调用checksFollow
时,可以放置关键字await
并等待响应。
async someMethodToCallChecksFollow() {
const result = await this.checksFollow();
console.log(result);
}
如果您想在HTML中使用响应,我建议将followState从原始boolean
更改为BehaviorSubject<boolean>
,然后调用this.followState.next(true)
例如:
export class YourService {
public followState = new BehaviorSubject<boolean>(false);
async checksFollow(followingID: string, followerID: string): boolean {
const followDoc =
this.angularFirestore.collection(`users/${followingID}/following`).doc(followerID).ref;
return followDoc.get().then((doc) => {
if (doc.exists) {
this.followState.next(true);
} else {
this.followState.next(false);
}
return this.followState.getValue();
});
}
}
然后在您的html中,您可以使用async
管道。
<div *ngIf="yourServiceInstance.followState | async">It is true</div>