我需要检查数据库中是否存在用户,如果是,则返回true。我有一个功能(我顺便使用firebase):
checkIfUserExists(login: string): boolean {
this.af.database.list('/users', {
query: {
orderByChild: 'login',
equalTo: login
}
}).subscribe(response => {
if(response.length === 0 ) return true
})
return false
}
问题是该函数总是返回false。它不等待检查订阅。有没有办法解决它?
答案 0 :(得分:2)
您可以返回observable本身:
checkIfUserExists(login: string): Observable<boolean> {
return this.af.database.list('/users', {
query: {
orderByChild: 'login',
equalTo: login
}
}).map(response => {
if(response.length === 0 ) {
return true;
} else {
return false;
}
});
}
在这种情况下,您可以像这样使用它:
checkIfUserExists('some username')
.subscribe(userExists => {
// Do something
});
这是因为您的处理是异步的,因此您需要使用回调处理处理。这样,您就可以确保在执行异步处理时执行处理。
你可以使用observables(rxjs - 就像我的样本一样)或承诺这样的用例。
答案 1 :(得分:0)
您可以返回一个承诺,然后拨打find()
:
checkIfUserExists(login: string): boolean {
return this.af.database.list('/users', {
query: {
orderByChild: 'login',
equalTo: login
}
}).subscribe(response => {
if(response.length === 0 )
return true;
return false;
}).toPromise().find();
}
答案 2 :(得分:0)
您可以使用Native Promise API返回承诺:
checkIfUserExists(login: string): boolean {
return new Promise(function(resolve, reject) {
this.af.database.list('/users', {
query: {
orderByChild: 'login',
equalTo: login
}
}).subscribe(response => {
if(response.length === 0 ) {
reject();
} else {
resolve()
}
})
});
}
然后将其用作,
checkIfUserExists('login').then(function(response) {
// found
}, function() {
// not found
});