надеюсь, что кто-то может помочь, у меня есть наблюдаемая, которая возвращает строку base64 внутри карты запроса http ниже
transform(url: string, asBase64: boolean): Observable<any> {
return this.http
.get(url, {responseType: 'blob'})
.pipe(map(val => {
if (!asBase64) {
return this.sanitizer.bypassSecurityTrustUrl(URL.createObjectURL(val))
}
let base64Data = null;
let reader = new FileReader();
reader.readAsDataURL(val);
reader.onloadend = () => {
base64Data = reader.result; // need to return this!
console.log(base64Data);
};
}));
}
Проблема в том, что мне нужно условно вернуть результат reader.onloadend = () => {
Полагаю, мне нужно преобразовать это в обещание и использовать mergeMap? Не уверен как.
Обновление
Так что еще один удар по этому ... Из документации mergeMap похоже, что это должно работать, отладка. Я вижу, как большой двоичный объект передается в reader.readAsDataURL(data);
, но return reader.result;
никогда не срабатывает, похоже, я теряю ссылку на reader
transform(url: string, asBase64: boolean): Observable<any> {
return this.http
.get(url, {responseType: 'blob'})
.pipe(map(val =>
<any>(asBase64 ? val : this.sanitizer.bypassSecurityTrustUrl(URL.createObjectURL(val)))
)).pipe(mergeMap(data => {
if (!asBase64) {
return of(data)
} else {
let reader = new FileReader();
let eventObservable = fromEvent(reader, 'onloadend').pipe(map(() => {
return reader.result;
}));
reader.readAsDataURL(data);
return eventObservable;
}
}));
}