【发布时间】:2019-01-17 00:37:51
【问题描述】:
希望有人可以帮助我在下面的 http 请求的映射中返回 base64 字符串的 observable
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 文档看起来这应该可以工作,调试我可以看到 blob 被传递给 reader.readAsDataURL(data); 但 return reader.result; 永远不会触发,看起来我正在失去对 @ 的引用987654325@
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;
}
}));
}
【问题讨论】:
-
fromEvent没有被弃用(只有它是带有结果选择器的变体被弃用),是的,你有Observable<Observable<any>> -
@martin 抱歉,我实际上并没有工作,知道我是如何做到这一点的吗?
-
我不知道你想做什么
-
你不必管道/映射 eventObservable 只需在最后返回它
-
@MehdiBenmoha 我需要映射,因为事件触发不提供任何响应。我现在已经想通了。最后我不得不使用一个主题,因为问题是 onloadend 事件在模板订阅 observable 之前触发,基本上是一种竞争条件。
标签: typescript rxjs rxjs6