Angular-方法不等待从Firebase获取值

时间:2018-08-19 20:03:53

标签: javascript angular typescript firebase firebase-realtime-database

我有一个在其构造函数中调用以下方法的类:

async fetchSSN() {
   this.userSSN = await firebase.database().ref(`allUsers/${this.currentUser}/SSN`).once('value');
   this.userSSN = this.userSSN.val();
}

基本上,它从用户节点中获取 SSN 的值,并将其存储为名为userSSN的全局变量。

稍后,我有一种使用 SSN 值的方法,以便从Firebase请求新数据。例如:

async getLastDocument() {
   firebase.database().ref(`allSSN/${await this.userSSN}/lastDocument`);
}

我遇到一个奇怪的问题,如果我从应用程序中的另一个类调用getLastDocument()方法,则await将不等待this.userSSN从以下构造函数中检索其值:自己的班级。基本上,它将尝试从allSSN/undefined/lastDocument获取数据-显然不是我想要的。

我在这里做错什么,如何避免这种情况?

1 个答案:

答案 0 :(得分:0)

编辑:

您不能等待构造函数中的promise。您可以做的是:

// Now, this.userSSN is a reference to a Promise.
fetchSSN() {
   this.userSSN = firebase.database().ref(`allUsers/${this.currentUser}/SSN`).once('value');
}

然后:

async getLastDocument() {
   firebase.database().ref(`allSSN/${(await this.userSSN).val()}/lastDocument`);
}

这样,“ waiter”在方法上,而不在构造函数上。


第一件事:

  1. 根据Firebase documentation.val()会返回值本身,因此this.userSSN是基本元素或对象(numberstring,无论)。

  2. 因此,一旦您不需要getLastDocument时,async就不必await

  3. 如果getLastDocument拥有this.userSSN = undefined,则意味着您没有事先调用fetchSSN或,我认为您的情况是,这些方法在{{1 }},您可能会在两个不同的service中定义它们,使它们成为两个不同的实例,那么您就不会调用相同的modules