javascript - 如何从 React Native FlatList 中的异步函数返回值?
问题描述
**我正在尝试过滤来自被阻止用户的帖子。**
我做了一个异步函数来检查用户是否被阻止:
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
)
}
}}
上述方法不起作用,我哪里出错了?
解决方案
我们没有确切的所有细节,但我可以看到这里的逻辑流程很奇怪。让我们看看发生了什么
FlatList
呈现与this.state.arrData
- 在 的每次迭代中
renderItem
,checkBlocked
使用用户的 id 进行异步调用 - 你渲染的东西基于
this.state.blocked
- 你的
checkBlocked
承诺解决了,blocked
状态中的变量被返回值覆盖
您正在做出一个承诺 ( checkBlocked(id).then()
),但您render
不会等待该承诺在它返回之前解决。因此,您this.state.blocked
尚未将您的定义定义为您在退货声明中的想法。 此外,setState
是async,这意味着您不能依赖return
语句中的值作为您刚刚设置的值checkBlocked
。
更好的模式是在渲染组件之前,通过异步循环运行用户列表,其中每个条目都使用checkBlocked
. 然后,您可以构造一个对象数组,例如usersWithBlockedStatus
,每个对象都有一个用户名和阻止状态。然后过滤掉所有blocked
状态为 true 的条目,并调用它usersThatAreNotBlocked
。仅当所有这些都完成后,您才能FlatList
将数据呈现为usersThatAreNotBlocked
.
您可以在问题How to call fetch() inside renderItem on FlatList?中找到另一个写得很好的解释?
推荐阅读
- python - 为什么我在运行 pip install MySQL-Python 时会出错?
- javascript - Javascript中的嵌套函数,需要将变量传递给父函数
- javascript - TypeError:a 在谷歌地图地理编码器中未定义
- system - 学习系统工程对软件工程师有价值吗?
- javascript - 使用来自多个 XMLHttpRequest 的响应更新 DOM
- python - 如何将每个单词转换为数字?
- python - NN:为什么手动实现比 Keras/TF 收敛得更好?
- c++ - 如何平行化直方图加法?
- java - 使用模拟和不使用模拟进行测试,测试时间
- php - PHP 禁用 SHM 缓存