访问firebase时,Promise返回错误的类型

时间:2017-05-23 07:44:21

标签: javascript angular firebase ionic-framework firebase-realtime-database

当用户进入页面时,我想检查用户是否已将数据输入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返回一个布尔值来检查数据是否在该位置?或者你还有其他解决办法吗?

2 个答案:

答案 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
   }
})

实际上,我现在正确地阅读了你的问题,我说的第一件事并不是导致你的错误的原因。这绝对是因为您要将Promiseboolean进行比较。并不意味着你不应该做第一件事:)

答案 1 :(得分:0)

问题是你直接将返回的promise与布尔值Provider.checkPath() === true进行比较。

由于promise只是值的包装器,为了获取promise中包含的值(在您的情况下为布尔值),您需要使用then方法。

代码看起来像那样

this.Provider.checkPath().then(function (value) {
  // 'value' is your boolean
})
顺便说一句,是的,使用Promise是一个非常好的主意,这正是他们的用例:)