【问题标题】:Unclear as to the usage of async and await in react native不清楚在 react native 中使用 async 和 await
【发布时间】:2019-08-30 09:59:39
【问题描述】:

我最近在一个业余项目中开始研究将 React Native 与 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() 关键字异步运行。我也知道该函数要求函数等待一次查询的结果,但我不理解的是在调用函数返回快照时使用异步。那里可能有文档或问题向您展示如何操作,但没有人可以回答我想了解的工作原理。

【问题讨论】:

  • 向 Stack Overflow 上的问题添加代码时,请不要显示代码图像。相反,将代码文本复制到问题本身并将其格式化为代码,以便更易于阅读和搜索。
  • @DougStevenson 已编辑,感谢您的提示。

标签: firebase react-native firebase-realtime-database async-await expo


【解决方案1】:

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

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

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

【讨论】:

  • 回调是否已经类似于等待,因此不需要后续异步?如果我的 return 给了我一个值,在这种情况下是一个 url,那么使用 .val() 和根本不使用它有什么区别。根据我的使用方式,它会在某处导致 typeError 吗?
  • 您可以将 await 视为自动将函数中的所有其余代码放入未嵌套在函数中的回调中。存在的唯一原因是使使用 Promise 的代码更易于阅读和编写。
猜你喜欢
  • 2019-09-10
  • 2016-07-31
  • 2017-10-31
  • 2021-04-01
  • 2019-01-05
  • 2018-10-11
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多