【问题标题】:How to return value from an Async function inside React Native FlatList? [duplicate]如何从 React Native FlatList 中的异步函数返回值? [复制]
【发布时间】:2021-02-13 06:51:58
【问题描述】:

**我正在尝试过滤来自被阻止用户的帖子。 **

我创建了一个异步函数来检查用户是否被阻止:

checkBlocked = async userId => {
  try {
  let snapshot = await firebase.database().ref('Blocked/' + firebase.auth().currentUser.uid).orderByChild('uid').equalTo(userId).once('value')
    return snapshot.exists();
  }
  catch(error) {
    return false;
  }
}

我想返回 flatlist 中的值,以便相应地显示帖子:-

<FlatList
        inverted
        extraData={this.state.blocked}
        data={this.state.arrData}
        keyExtractor={item => item.key}

        renderItem={({ item }) => {
         
         
          this.checkBlocked(item.id).then(val => this.setState({blocked: val}));
         
            if(this.state.blocked == true){
              return (
              //something
                 )
            }

          else {
             
          return (
            //something
                 )
            }
         }}

上述方法不起作用,我哪里出错了?

【问题讨论】:

    标签: javascript reactjs firebase react-native react-native-flatlist


    【解决方案1】:

    我们没有确切的所有细节,但我可以看到这里的逻辑流程很奇怪。让我们看看发生了什么

    1. FlatList 渲染为 this.state.arrData
    2. renderItem 的每次迭代中,checkBlocked 使用用户 ID 进行异步调用
    3. 您根据this.state.blocked 渲染某些东西
    4. 您的checkBlocked 承诺解决,状态中的blocked 变量被返回值覆盖

    您正在做出承诺 (checkBlocked(id).then()),但您的 render 不会等待该承诺解决后再返回。因此,您的 this.state.blocked 尚未定义为您在退货声明中的想法。 另外setStateasync,这意味着您不能依赖 return 语句中的值作为您刚刚从 checkBlocked 设置的值。

    更好的模式是在渲染组件之前,通过异步循环运行用户列表,其中每个条目都使用checkBlocked 检查。然后,您可以构造一个对象数组,例如usersWithBlockedStatus,每个对象都有一个用户名和阻止状态。然后过滤掉所有blocked 状态为真的条目,并将其命名为usersThatAreNotBlocked。仅当所有这些都完成后,您才能使用 usersThatAreNotBlocked 的数据呈现您的 FlatList

    您可以在问题How to call fetch() inside renderItem on FlatList?中找到另一个写得很好的解释

    【讨论】:

    • 非常感谢!!!我在 componentDidMount 中创建了一个单独的被阻止用户数组,然后检查用户 ID 是否存在于被阻止的用户数组中,如果不打印帖子。非常感谢,因为你,我才能想到这种方法!
    • 乐于助人。
    猜你喜欢
    • 2021-10-18
    • 2016-01-14
    • 1970-01-01
    相关资源
    最近更新 更多