首页 文章

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

提问于
浏览
0

当用户进入页面时,我想检查用户是否已将数据输入到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

  }
}

但现在出现以下错误:

类型'Promise <any>'不能赋值为'boolean' .

我的第一个问题是:在使用Promise检查是否有来自用户的数据时,我是否正确?在我看来,需要一个承诺,否则页面会做它的事情,但可能是数据没有被加载 .

第二个问题是:如何从promises中获取布尔值返回以检查数据是否在该位置?或者你还有其他解决办法吗?

2 回答

  • 0

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

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

    代码看起来就像那样

    this.Provider.checkPath().then(function (value) {
      // 'value' is your boolean
    })
    

    顺便说一句,是的,使用 Promise 是一个非常好的主意,这正是他们的用例:)

  • 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 
        }
    }
    

    或者使用基本的Promise处理:

    this.Provider.checkPath().then((result: boolean) => {
       if (result) {
           //Here I retrieve data from firebase
       }
    })
    

    实际上,我现在正确地阅读了你的问题,我说的第一件事并不是's causing your error. That'肯定是因为你试图将 Promiseboolean 进行比较 . 不管怎样做't mean that you shouldn'不管怎么说:)

相关问题