【问题标题】: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 尚未定义为您在退货声明中的想法。 另外,setState 是 async,这意味着您不能依赖 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
    相关资源
    最近更新 更多