@Solevoy_2015

Как приостановить работу map до выполнения определённых условий пере return?

Я получаю fileList с фотографиями от пользователя из input type='file' и через map хочу отрисовать их, но для того чтобы получить url загруженных пользователем картинок я использую FileReader у которого при отработке map readState = 1 и поле result пустое. Грубо говоря мне нужно заморозить map перед return, пока FileReader не создаст url.
[...selectedImages].map((image, index) => {
                            const reader = new FileReader()
                            reader.readAsDataURL(image)
//тут остановить до тех пор пока reader.result === null
                            return (
                                <img src={reader.result} alt="" key={`previewImage:${index}`} />
                            )
                        })


Я естественно могу и иначе сделать, просто интересно, есть ли способы решить задачу. Пишу на React
  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега JavaScript
Python, JS, WordPress, SEO, Bots, Adversting
Пишу на React

Какой интересный язык.

const [imageUrls, setImageUrls] = useState([]);

async function readAsDataURL(image) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader();
        reader.onload = () => resolve(reader.result);
        reader.onerror = reject;
        reader.readAsDataURL(image);
    });
}

useEffect(() => {
    (async () => {
        try {
            const urlPromises = selectedImages.map(readAsDataURL);
            const urls = await Promise.all(urlPromises);
            setImageUrls(urls);
        } catch (error) {
            console.error(error);
        }
    })();
}, [selectedImages]);

return imageUrls.map((url, index) => <img src={url} alt="" key={`previewImage:${index}`} />);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@iljaGolubev
Завернуть FileReader в Promise
как-то так

const readAsDataURL = (image) => {
  const fr= new FileReader();
  return new Promise((resolve, reject) => {
    fr.onerror = () => {  fr.abort();  reject(new Error( 'err msg' ));  };

    fr.onload = () => { resolve(fr.result); };
    fr.readAsDataURL(image)
  });
};


[...selectedImages].map( async (image, index) => {
   const data =  await readAsDataURL(image)
   return (<img src={data} alt="" key={`previewImage:${index}`} />
})
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы