У меня есть рабочий код для преобразования моего объекта 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. Есть ли способ преобразовать это событие в новое наблюдаемое и передать его в цепочку?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


нет готового метода для преобразования этого загруженного события в наблюдаемое 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))
Это репозиторий, где я определил некоторые функции-оболочки, чтобы превратить стандартные
node.fsобщедоступные функции на основе обратного вызова в Observables.