Maison > Questions et réponses > le corps du texte
P粉4398045142023-09-03 16:06:45
Cela dépend donc vraiment de la façon dont le code est exécuté, en particulier de la nature asynchrone de setState afin que vous puissiez utiliser le formulaire de rappel de setState . Voici un exemple :
setBlobs(prevBlobs => [...prevBlobs, res._bodyBlob]);
Voici l'exemple complet avec le reste du code :
const capturePhoto = async () => { const photo = await camera.current.takePhoto(); fetch(photo.path) .then(res => { setBlobs(prevBlobs => [...prevBlobs, res._bodyBlob]); console.log('blobs', blobs.length, blobs); }) .catch(err => { console.log('err', err); }); checkLength(); }; const checkLength = async () => { if (blobs.length >= 2) { // upload files to a folder with the current date in a firebase cloud bucket const datestring = new Date().toLocaleString('de-DE'); blobs.forEach((blob, i) => { uploadFile(blob, datestring + '/' + (i + 1) + '.jpg'); }); // reset state setBlobs([]); sendNotification('Photos uploaded'); toggleDialog(); } };
P粉7757237222023-09-03 16:04:09
Cela ressemble à trois choses :
checkLength
avant que la récupération ne soit terminée. setState
的新值。这是 React 的基本思想(是否是个好主意还有待商榷),状态值在渲染期间是不可变的。 setState
avant le prochain rendu, juste le prochain état immuable qui sera utilisé par le prochain rendu. setState
依赖于先前的状态时,您应该将回调传递给setState
,而不是直接使用当前值。举个例子,假设你有一个空数组,你调用 fetch 一次,然后在第一个数组完成之前再次调用 fetch 。在执行 ...blob
时,这两个 setState
调用都会引用空数组。通过传递回调,setState
Obtenez la dernière valeur transmise en tant que paramètre. Plus d'informations : https://react.dev/reference/react/Component#setstate La solution la plus simple est de passer le tableau comme argument à setState
回调内的 checkLength
dans le rappel setState
.
Voici le .then()
en question :
const capturePhoto = async () => { const photo = await camera.current.takePhoto(); fetch(photo.path) .then(res => { setBlobs(prev => { const newBlobs = [...prev, res._bodyBlob]; console.log('blobs', newBlobs.length, newBlobs); checkLength(newBlobs); return newBlobs; }); }) .catch(err => { console.log('err', err); }); };
C'estasync
await
const capturePhoto = async () => { const photo = await camera.current.takePhoto(); const res = await fetch(photo.path).catch(console.error); if (!res) return; setBlobs(prev => { const newBlobs = [...prev, res._bodyBlob]; console.log('blobs', newBlobs.length, newBlobs); checkLength(newBlobs); return newBlobs; }); };
检查长度
const checkLength = async (newBlobs) => { if (newBlobs.length >= 2) { // upload files to a folder with the current date in a firebase cloud bucket const datestring = new Date().toLocaleString('de-DE'); newBlobs.forEach((blob, i) => { uploadFile(blob, datestring + '/' + (i + 1) + '.jpg'); }); // reset state setBlobs([]); sendNotification('Photos uploaded'); toggleDialog(); } };