Firebase React native Expo загрузка файлов и загрузка обещание решения проблем

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

# #javascript #firebase #react-native #firebase-хранилище

Вопрос:

У меня возникла проблема, когда массив не заполнен, я думаю, что это как-то связано с решением промо-акций.

 const UploadFile = async ({
  imageName = `${Date.now()}`,
  imageUris,
  imageFolder = '',
  metadata,
}: IFile) => {
 if (imageUris) {
    const promises: any[] = [];
    const imageURLs: string[] = [];

    imageUris.forEach(async (uri) => {
      const randomNumber = Randomize('0', 10);
      const finalImageName = `${Slugify(imageName)}`.toLowerCase();

      const imagePath = `${imageFolder}/${finalImageName}-${randomNumber}`;
      const imageRef = storageRef.child(imagePath);
      const blob = (await fetch(uri)).blob();

      const uploadTask = imageRef.put(await blob, metadata);

      uploadTask.on(
        firebase.storage.TaskEvent.STATE_CHANGED,
        (snapshot) => {
          const progress =
            (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
            console.log('Upload is '   progress   '% done');
        },
        (error) => console.log('Error:', error),
        () => {
          uploadTask.snapshot.ref.getDownloadURL().then((downloadURL) => {
            console.log('File available at', downloadURL);
            imageURLs.push(downloadURL);
          });
        },
      );

      promises.push(uploadTask);
    });

    // Not sure promise is resolving
    Promise.all(promises).then((i) => {
      console.log('All files uploaded', i);
    });

    Promise.all(imageURLs).then((i) => {
      console.log('All imageURLs', i);
    });
  }
}
 

Вывод:

 Retrieved listings
All files uploaded Array []
All imageURLs Array []
imageURLs Contents undefined
Upload is 0% done
Upload is 0% done
Upload is 100% done
File available at https://firebasestorage.googleapis.com/v0/b/wrecknet-ab69d.appspot.com/o/listings/car-5701393331?alt=mediaamp;token=ccfda911-36fb-4305-b6d7-0ee06fc824e1
Listing was successfully created
Upload is 100% done
File available at https://firebasestorage.googleapis.com/v0/b/wrecknet-ab69d.appspot.com/o/listings/car-4491812919?alt=mediaamp;token=03f72706-4201-4652-9172-8bcefaeb3e1f
 

Как вы можете видеть, массивы «All files uploaded Array []» и «All imageURLs Array []» пусты, я подозреваю, что обещание не выполняется.

Ответ №1:

Насколько я знаю, вы можете слушать либо the on() of , UploadTask либо its then() , но не оба. К счастью, вы не делаете ничего значимого в on обработке, поэтому весь код можно упростить до:

 const UploadFile = async ({
  imageName = `${Date.now()}`,
  imageUris,
  imageFolder = '',
  metadata,
}: IFile) => {
 if (imageUris) {
    const promises: any[] = [];

    imageUris.forEach(async (uri) => {
      const randomNumber = Randomize('0', 10);
      const finalImageName = `${Slugify(imageName)}`.toLowerCase();

      const imagePath = `${imageFolder}/${finalImageName}-${randomNumber}`;
      const imageRef = storageRef.child(imagePath);
      const blob = (await fetch(uri)).blob();

      promises.push(imageRef.put(await blob, metadata));
    });

    Promise.all(promises).then((imageURLs) => {
      console.log('All imageURLs', imageURLs);
    });
  }
}