【问题标题】:Promise returns a wrong type when accessing firebasePromise 在访问 firebase 时返回错误的类型
【发布时间】:2017-05-23 16:49:37
【问题描述】:

当用户进入页面时,我想检查用户是否已经将数据放入了 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&lt;any&gt;' is not assignable to type 'boolean'.

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

第二个问题是:如何从承诺返回中获取布尔值以检查数据是否在该位置?或者您有其他解决方案吗?

【问题讨论】:

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


【解决方案1】:

首先,你得到的错误是由于最新的TypeScript 版本。他们要求您在 new Promise&lt;T&gt; 语句中指定此 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
   }
})

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

【讨论】:

  • 明白。我改变了承诺的类型。当您说“基本的 Promise 处理”时,您的意思是像下面答案中提到的 @atomrc 吗?我对编码很陌生,所以请原谅我的愚蠢。
  • 确实如此。您可以使用then()。但不要使用 function 关键字,因为这会混淆 this 上下文。您应该使用箭头符号:() =&gt; {}。我会用一个例子来更新我的答案。
  • 在纠正了另一个愚蠢的错误(关于检索数据)之后,它现在可以工作了。非常感谢!
【解决方案2】:

问题是您直接将返回的承诺与我们所做的布尔值进行比较 Provider.checkPath() === true

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

代码看起来像这样

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

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

【讨论】:

  • 这是有道理的。我现在这样做了:ionViewDidEnter() { this.szenarioProvider.checkPath().then(function (value) { if(value === true) { //retrieve Data here } }); } 但它抛出了Cannot read property 'szenarioProvider' of undefined TypeError
  • 完整的错误信息是:Uncaught (in promise): TypeError: Cannot read property 'szenarioProvider' of undefined
  • 正如@PierreDuc 在上面的答案中所说,我必须使用箭头功能。不过:谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2020-05-26
相关资源
最近更新 更多