Проблема с загрузкой нескольких изображений React Native Firebase

# #javascript #typescript #react-native #firebase-storage

Вопрос:

В React Native я выбираю изображения с помощью пакета ImagePicker и загружаю изображения в хранилище Firebase. Я также хочу отправить ссылки на изображения хранилища Firebase с помощью метода Getdownloadurl() с помощью api Firebase Rest.

Мне удается загружать изображения, но когда я отправляю их, отправляя запрос на публикацию rest api, ссылки на изображения становятся неопределенными. Я следую с экрана консоли, отправляя запрос на публикацию без 100% от общего размера изображения.

 const uploadImage = async (uploadUri: string, transferred: number) => {
    let filename = uploadUri.substring(uploadUri.lastIndexOf('/')   1);
    transferred = 0;
    const storageRef = storage().ref(`images/${filename}`);
    const task = storageRef.putFile(uploadUri);
    task.on('state_changed', taskSnapshot => {
        console.log(`${taskSnapshot.bytesTransferred} transferred out of ${taskSnapshot.totalBytes}`);
        transferred = Math.round((taskSnapshot.bytesTransferred / taskSnapshot.totalBytes) * 100);
    });
    try {
        await task;
        const url = await storageRef.getDownloadURL();
        return url;
    } catch (error) {
        console.log(error);
        return null;
    }
}

export const addPost = (files: string[], post: Post): ThunkAction<void, RootState, null, AddPostAction> => {
    return async dispatch => {
        try {
            dispatch({ type: ADD_POST_LOADING, payload: true });
            const imageData: Image[] = [];
            files.map(async (item) => {
                const imageUrl = await uploadImage(item, 0);
                imageData.push({ image: imageUrl! });
            });
            const postData: Post = {
                ...post,
                thumb: imageData[0].image
            }
            const response = await fetch(`${BASE_URL}/post.json`, { method: "POST", body: JSON.stringify(postData) });
            if (response.ok) {
                const successPostData: AddPostSuccess = await response.json();
                dispatch({ type: ADD_POST_SUCCESS, payload: successPostData });
            } else {
                dispatch({ type: ADD_POST_ERROR, payload: "404" });
            }

        } catch (error) {
            console.log(error);
        }
    }
}
 

Ответ №1:

A map не может обрабатывать async код. Попробуйте изменить эту часть:

  files.map(async (item) => {
                const imageUrl = await uploadImage(item, 0);
                imageData.push({ image: imageUrl! });
            });
 

к этому:

 for (let i = 0; i < files.length; i  ) {
              const item = files[i];
              const imageUrl = await uploadImage(item, 0);
                imageData.push({ image: imageUrl! }); 
            }