gpt4 book ai didi

reactjs - {React Native} Async\Await 无法与 setState 正常工作

转载 作者:行者123 更新时间:2023-12-02 19:32:07 25 4
gpt4 key购买 nike

有人可以帮助我理解我做错了什么吗?考虑这个简单的代码

 var images = []; 
const [funImage, setFunImage] = useState([]);


//Some function that does this below
firebase.firestore().collection('PostedFunActivities').where("location", "==" , place).get().then((querySnapshot) =>{
querySnapshot.forEach(async(doc) =>{
const ref = firebase.storage().ref('images/'+ doc.data().image)
const result = await ref.getDownloadURL();
images.push(result);
})
setFunImage(images);
});

我不明白为什么 setFunImage(images);images.push(result); 完成将所有结果插入数组之前执行。我认为等待会阻止其下面的其余代码基本上,我想要做的事情背后的概念是将所有结果推送到images,然后调用setFunImage(images);

我怎样才能实现这一目标?这可能吗?

编辑

我更改了代码,希望找到解决方案,这就是我到目前为止所达到的目标:

firebase.firestore().collection('PostedFunActivities').where("location", "==" , place).get().then((querySnapshot) => {
querySnapshot.forEach(async(doc) => {
const ref = firebase.storage().ref('images/' + doc.data().image)
const result = await ref.getDownloadURL();
images.push(result);
setFunImage(...funImage,images);
})
});

有趣的是,当这个函数执行时,funImage 会填充 1 个图像,但是当我刷新时,它会填充我的 firebase 中的其余图像。

看看这个 GIF of my running app and the issue with the setState

最佳答案

该代码不起作用,因为您的 forEach 正在运行异步代码。这意味着它将在您设置图像后完成运行。这是一个修复程序,并在评论中提供了一些解释 -

// No need for images array outside
const [funImage, setFunImage] = useState([]);

...

firebase.firestore().collection('PostedFunActivities').where("location", "==" , place).get().then(async (querySnapshot) =>{
// instead of foreach, using map to aggregate the created promises into one array
// Promise.all takes an array of promises and resolves after all of them completed running
// returns an array with the promise results
const images = await Promise.all(querySnapshot.map(async(doc) =>{
const ref = firebase.storage().ref('images/'+ doc.data().image)
const result = await ref.getDownloadURL();
return result;
}));
setFunImage(images);
});

关于reactjs - {React Native} Async\Await 无法与 setState 正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61630313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com