javascript - 如何在映射的promise中一一修改useState数组
问题描述
我有
const [items, setItems] = useState<any[]>(itemsB.map(() => ({ loading: true })));
和
itemsB.map(async (itemB: any, index: number) => {
searchItems(itemB).then(result => {
const newItems = [...items]; // Ref A
newItems[index] = result;
setItems(newItems);
})
})
因为内部函数是异步获取,所以项目以不可预测的顺序返回,我想在items
它们准备好后立即添加它们,用实际结果更改占位符加载对象。这几乎可以做到这一点,但是items
在 Ref A 处引用的内容不会更新,因此它会循环更改每件事,然后最后只出现最后一个已检索的项目。
如果我做 a Promise.all().then()
,它会等到所有项目都被检索到执行then
部分,所以我想知道如何在项目被解决时设置它们。
解决方案
对 setItems 的调用被批处理以优化性能。如果先前的状态依赖于当前状态,请使用 setItems 的重载版本,它将 previousState 作为第一个参数。
searchItems(itemB).then(result => {
setItems(items => {
const newItems = [...items]; // Ref A
newItems[index] = result;
return newItems;
});
})
推荐阅读
- android - Toast 的功能:setGravity() - 不改变位置
- typescript - 打字稿通过项目传播选项
- c# - Elastic NEST 客户端如何按嵌套属性排序
- python - 如何在 Django 的投票应用程序中对所有问题使用相同的选择
- python - 如何“实时”获取浏览器中正在访问的 URL?
- python - 如何让我的不和谐机器人对我的消息做出反应
- docker - sql容器问题的Docker格式化密码
- python - 训练模型后 Jupyter Notebook GPU 内存释放
- typescript - 键的打字稿联合类型,字典值的推断类型
- python - FastCGI 随机崩溃