JS Promise - вернуть некоторые результаты без разрешения обещания - PullRequest
3 голосов
/ 23 мая 2019

Я делаю функцию для загрузки видео с хранилищем Firebase.Я хочу получить состояние прогресса процесса загрузки, а также успех или неудачу этого процесса с помощью Promise.

Вот код:

video.service.js

function uploadVideo(generatedFileName, file) {
  return new Promise((resolve, reject) => {
    firebaseStorageReference
      .child("videos/" + generatedFileName)
      .put(file)
      .on(
        "state_changed",
        snapshot => ???,
        error => reject(error),
        () => resolve(file)
      );
  });
}

video.component.js

function uploadVideo() {
    videoService
      .uploadVideo()
      .then(video => success(video))
      .catch(error => error());
};

Я хотел бы иметь какое-то событие, которое будет запускаться в файле video.component.js, чтобы обнаружить изменение прогресса.Но я все еще хочу, чтобы мое обещание было выполнено после успешного разрешения файла.

Есть предложения?

Спасибо,

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Из документации по пожарной базе:

  1. put функция возвращает UploadTask объект
  2. UploadTask предоставляет возможность получать обновления о ходе загрузки

Один из способов достижения вашей цели - отправить обратный вызов в качестве параметра на uploadVideo и использовать его каждый раз, когда UploadTask сообщает нам, что есть обновление о ходе загрузки:

function uploadVideo(generatedFileName, file, progressCallback) {
  return new Promise((resolve, reject) => {
    firebaseStorageReference
      .child("videos/" + generatedFileName)
      .put(file)
      .on(
        firebase.storage.TaskEvent.STATE_CHANGED,
        'next': snapshot => {
            const percent = snapshot.bytesTransferred / snapshot.totalBytes * 100;
            progressCallback(percent);
         },
        'error': error=> reject(error),
        'complete': complete => resolve(complete)
      );
  });
}

Этот код не проверен! Я только изменил их пример, чтобы он соответствовал вашим потребностям.

0 голосов
/ 23 мая 2019

Я бы использовал старый добрый обратный вызов, чтобы прикрепить

function uploadVideo(attachProgressEvent) {
  return new Promise((resolve, reject) => {
    let i = 0;

    Array.from(new Array(10)).forEach((x, xi) => {
      setTimeout(() => {
        if (typeof attachProgressEvent === 'function') {
          attachProgressEvent(i, 10);
        }

        i += 1;

        if (i === 10) {
          resolve();
        }
      }, xi * 100);
    });
  });
}


uploadVideo((i, tot) => {
    console.log(`Progress of ${i}/${tot}`);
  })
  .then(() => {
    console.log('All done');
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...