Цепочка Rxjs для преобразования observable<File> в observable<string> (base64)

У меня есть рабочий код для преобразования моего объекта File в base64:

let reader = new FileReader();
     reader.readAsDataURL(myFile);
     reader.onload = () => {
         let resultStrOrArrayBuf = reader.result;
         if (!(resultStrOrArrayBuf instanceof ArrayBuffer)) {
            ..do something with resultStrOrArrayBuf
         }
    };

Однако теперь мне нужно интегрировать эту часть в существующую цепочку rxjs. В цепочке я получаю объект File и хотел бы продолжить преобразование в base64. Однако преобразование выполняется с помощью события onload. Есть ли способ преобразовать это событие в новое наблюдаемое и передать его в цепочку?

Это репозиторий, где я определил некоторые функции-оболочки, чтобы превратить стандартные node.fs общедоступные функции на основе обратного вызова в Observables.

Picci 11.12.2020 14:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
1 220
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

нет готового метода для преобразования этого загруженного события в наблюдаемое rxjs. вам придется сделать свой собственный оператор.

export const dataUrlToObs = myFile => new Observable<string | ArrayBuffer>(subscriber => {
  const reader = new FileReader();
  reader.readAsDataURL(myFile);
  reader.onload = () => {subscriber.next(reader.result); subscriber.complete(); };
  reader.onerror = () => subscriber.error(reader.error);
  return () => reader.abort(); // cancel function in case you unsubscribe from the obs
}

позже его можно использовать так:

..chain
switchMap(myFile => dataUrlToObs(myFile)),
tap(resultStrOrArrayBuf => {
   if (!(resultStrOrArrayBuf instanceof ArrayBuffer)) {
         ..do something with resultStrOrArrayBuf
   }
})

Рассмотрим следующую вспомогательную функцию, которая принимает Blob в качестве параметра и возвращает Observable<string>:

function blobToBase64(blob: Blob): Observable<string> {
  return new Observable<string>(observer => {
      const reader = new FileReader();
      reader.onerror = observer.error;
      reader.onabort = observer.error;
      reader.onload = () => observer.next(reader.result as string);
      reader.onloadend = observer.complete;
      reader.readAsDataURL(blob);

      return {
        unsubscribe: reader.abort
      }
  })
}

Использование:

declare const fileObservable: Observable<File>;

fileObservable
  .pipe(switchMap(blobToBase64))
  .subscribe(base64 => console.info(base64))

Другие вопросы по теме