Angular 等待布尔函数完成
Angular Wait for boolean function to finish
我正在尝试从我的 firestore 数据库中获取用户列表,并确定登录的用户是否是管理员(即他在列表中)。
这是我的代码:
isAdmin(user: any): boolean {
var col = this.afs.collection('admins');
var docRef = col.doc('mini-admins');
docRef.ref.get().then(function (doc) {
if (doc.data().user == user)
return true;
}).catch(function (error) {
console.log("Error getting document:", error);
});
return false;
}
但是,即使用户是管理员,该功能也不起作用。看起来它并没有等它完成再继续。
我该如何解决这个问题?
.then
表示 ref.get
是一个异步函数。您不能等待异步函数。您只能 return Promise return 从它或正确链接的新 Promise 中编辑,并在调用者站点上传递另一个回调以在 Promise 完成时执行代码:
isAdmin(user: any): Promise<boolean> {
var col = this.afs.collection('admins');
var docRef = col.doc('mini-admins');
// vvv added return
return docRef.ref.get().then(function (doc) {
return doc.data().user == user;
}).catch(function (error) {
console.log("Error getting document:", error);
});
}
然后像
一样使用它
this.isAdmin(user).then(response => {
if(response) {
...
} else {
...
}
});
它不工作,因为它是异步的。要使其正常工作,您需要将其稍微更改为:
isAdmin(user: any): Observable<boolean> {
return new Observable(observer => {
var col = this.afs.collection('admins');
var docRef = col.doc('mini-admins');
docRef.ref.get().then(function (doc) {
if (doc.data().user == user) {
observer.next(true);
observer.complete();
}
}).catch(function (error) {
observer.error(error);
observer.complete();
console.log("Error getting document:", error);
});
});
}
然后在你的代码中,当你想检查用户是否是管理员时,按以下方式调用这个函数:
this.isAdmin(user).subscribe(success => { ... }, error => { ... });
我正在尝试从我的 firestore 数据库中获取用户列表,并确定登录的用户是否是管理员(即他在列表中)。
这是我的代码:
isAdmin(user: any): boolean {
var col = this.afs.collection('admins');
var docRef = col.doc('mini-admins');
docRef.ref.get().then(function (doc) {
if (doc.data().user == user)
return true;
}).catch(function (error) {
console.log("Error getting document:", error);
});
return false;
}
但是,即使用户是管理员,该功能也不起作用。看起来它并没有等它完成再继续。
我该如何解决这个问题?
.then
表示 ref.get
是一个异步函数。您不能等待异步函数。您只能 return Promise return 从它或正确链接的新 Promise 中编辑,并在调用者站点上传递另一个回调以在 Promise 完成时执行代码:
isAdmin(user: any): Promise<boolean> {
var col = this.afs.collection('admins');
var docRef = col.doc('mini-admins');
// vvv added return
return docRef.ref.get().then(function (doc) {
return doc.data().user == user;
}).catch(function (error) {
console.log("Error getting document:", error);
});
}
然后像
一样使用它this.isAdmin(user).then(response => {
if(response) {
...
} else {
...
}
});
它不工作,因为它是异步的。要使其正常工作,您需要将其稍微更改为:
isAdmin(user: any): Observable<boolean> {
return new Observable(observer => {
var col = this.afs.collection('admins');
var docRef = col.doc('mini-admins');
docRef.ref.get().then(function (doc) {
if (doc.data().user == user) {
observer.next(true);
observer.complete();
}
}).catch(function (error) {
observer.error(error);
observer.complete();
console.log("Error getting document:", error);
});
});
}
然后在你的代码中,当你想检查用户是否是管理员时,按以下方式调用这个函数:
this.isAdmin(user).subscribe(success => { ... }, error => { ... });