reactjs - 在这种情况下,setstate 会在 Object map 之后运行吗?
问题描述
我有以下代码:
export function getMembersInDB(status) {
if (this.state.data) {
let membersObject = this.props.members;
let membersList = [];
Object.keys(membersObject).map(async (key) => {
membersObject[key]['uid'] = key;
membersObject[key]['profilePic'] = require("../../assets/img/empty-avatar.png");
if (membersObject[key]['mStatus'] == status) {
membersList.push(membersObject[key]);
}
});
this.setState({
data: membersList,
loading: false,
});
}
}
对于整个异步的事情,我想知道。this.setState 是否会等待 Object.keys 映射在设置之前完成执行,或者 this.setState 之前是否有机会更新?
解决方案
我不确定technophyle是否正确。
他们在被调用membersList
之前将被填充是正确的setState
,但是如果你在地图中有异步调用,在被调用之前membersList
不会被填充setState
!
请参阅https://repl.it/repls/KindWeeAddin上的以下代码。
在第一种情况下,“ membersListWait
”在之后是空的,.map
但“ membersList
”在之后是填充的.map
。
function getMembersInDB() {
let membersObject = {prop1: 1, prop2: 2, prop3: 3};
let membersListWait = [];
let membersList = [];
Object.keys(membersObject).map(async (key) => {
await sleep(1000);
membersListWait.push(membersObject[key]);
});
Object.keys(membersObject).map(async (key) => {
membersList.push(membersObject[key]);
});
console.log(membersListWait) // prints "[]"
console.log(membersList) // prints "[1, 2, 3]"
}
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
getMembersInDB()
推荐阅读
- html - 带有框阴影的 DIV 元素出现在带有图像的 DIV 元素后面
- postgresql - Spring Boot 使用 SSL 证书连接数据库
- c# - 连接字符串属性尚未初始化 Entity Framework Core
- css - 弹出模式(固定)出现在 safari 上的页眉和页脚后面
- excel - VBA:数组引用的合并函数(文本和数字的混合)
- visual-studio-code - VS Code 中基于第一行内容的自定义语言关联
- opengl - 关于 Wavefront .obj 格式设计的问题
- mysql - 如何确保我的代码中不会发生丢失更新?
- dynamics-crm - 用于将 AD 用户添加到 Microsoft Dynamics 365 帐户的脚本
- arrays - 如何使用循环在 Assembly 中查找数组的最小值和最大值?