Firebase 不清楚react native中async和wait的用法

Firebase 不清楚react native中async和wait的用法,firebase,react-native,firebase-realtime-database,async-await,expo,Firebase,React Native,Firebase Realtime Database,Async Await,Expo,最近,我开始在一个附带项目中深入研究如何使用React Native with Expo。我想从Firebase异步加载数据,并在多次尝试和谷歌搜索后实现了这一点,但我仍然不完全理解它是如何工作的 componentDidMount = async() => { await ref.once('value', async (snapshot) => { let imageUrl = []; snapshot.forEach(function(ur

最近,我开始在一个附带项目中深入研究如何使用React Native with Expo。我想从Firebase异步加载数据,并在多次尝试和谷歌搜索后实现了这一点,但我仍然不完全理解它是如何工作的

 componentDidMount = async() => {
      await ref.once('value', async (snapshot) => {
      let imageUrl = [];
      snapshot.forEach(function(urlSnapshot) {
        imageUrl.push(urlSnapshot)
      });
      this.setState({ items : imageUrl});
    });
  }
在下图中,我知道我在告诉componentDidMount通过async()关键字异步运行。我还知道函数要求函数等待once查询的结果,但我不理解的是调用函数返回快照时使用了异步。可能会有一些文档或问题向您展示如何执行此操作,但没有一个文档可以回答我想了解的工作原理。

ref.once()
()返回一个承诺,该承诺在数据库查询完成时解决。您也可以像现在这样提供回调,但在异步函数中,这只会使事情变得更复杂。您应该只使用返回的承诺。这将使您的代码更易于阅读

另外,您应该在某个时候调用
val()
,将快照子级转换为实际为字符串的内容。我将猜测什么时候会发生这种情况,但由于您没有提供数据库结构,因此无法确定

const snapshot = await ref.once('value');
const urls = [];
snapshot.forEach(urlSnapshot => {
    urls.push(urlSnapshot.val());
});
this.setState({ items: urls });

在堆栈溢出问题中添加代码时,请不要显示代码的图像。相反,将代码文本复制到问题本身中,并将其格式化为代码,以便更易于阅读和搜索。@DougStevenson编辑,谢谢您的提示。回调是否已经像等待一样工作,因此不需要后续异步?如果我的返回给我一个值,在本例中是一个url,那么使用.val()和根本不使用它有什么区别。根据我想如何使用它,它是否会在某个地方导致typeError?您可以将Wait想象为自动将函数中的所有剩余代码放入回调,而回调并不嵌套在函数中。它存在的唯一原因是使使用承诺的代码更易于阅读和编写。