当用户进入页面时,我想检查用户是否已将数据输入firebase位置。我为此目的使用此代码:
(在提供者内部)
checkPath(): Promise<boolean> {
return new Promise((resolve, reject) => {
firebase.database().ref('/Data')
.child(firebase.auth().currentUser.uid).child("dataID")
.on('value', data => {
resolve(data.exists());
});
});
}
(在页面内:)
ionViewDidEnter() {
if(this.Provider.checkPath() === true) {
//Here I retrieve data from firebase
}
}
但现在出现以下错误:
Type 'Promise<any>' is not assignable to type 'boolean'.
我的第一个问题是:在使用Promise检查用户是否有数据时,我是否正确?在我看来,需要一个承诺,否则页面会做它的事情,但可能是没有加载数据。
第二个问题是:如何从promises返回一个布尔值来检查数据是否在该位置?或者你还有其他解决办法吗?
答案 0 :(得分:2)
首先,您获得的错误是由最新的TypeScript
版本引起的。他们要求您在new Promise<T>
语句中指定此Promise
的返回类型:
checkPath(): Promise<boolean> {
return new Promise<boolean>((resolve, reject) => {
firebase.database().ref('/Data')
.child(firebase.auth().currentUser.uid).child("dataID")
.on('value', data => {
resolve(data.exists());
});
});
}
第二点是,你不能像那样检查你的Promise回报。您应该使用TypeScript中的await / async(我更喜欢):
ionViewDidEnter() {
this.checkPath();
}
async checkPath(): Promise<void> {
if((await this.Provider.checkPath()) === true) {
//Here I retrieve data from firebase
}
}
或使用基本的承诺处理:
this.Provider.checkPath().then((result: boolean) => {
if (result) {
//Here I retrieve data from firebase
}
})
实际上,我现在正确地阅读了你的问题,我说的第一件事并不是导致你的错误的原因。这绝对是因为您要将Promise
与boolean
进行比较。并不意味着你不应该做第一件事:)
答案 1 :(得分:0)
问题是你直接将返回的promise与布尔值Provider.checkPath() === true
进行比较。
由于promise只是值的包装器,为了获取promise中包含的值(在您的情况下为布尔值),您需要使用then
方法。
代码看起来像那样
this.Provider.checkPath().then(function (value) {
// 'value' is your boolean
})
顺便说一句,是的,使用Promise
是一个非常好的主意,这正是他们的用例:)