我正在尝试为变量分配可观察值,但是它返回未定义。
有没有办法将此值分配给订阅方法之外的变量?
new Observable((observer) => {
const reader = new FileReader();
reader.onload = () => {
observer.next(reader.result);
observer.complete();
};
reader.onerror = e => observer.error(e);
reader.readAsDataURL(file);
return () => {
if (reader.readyState === 1) {
reader.abort();
}
};
});
let result;
getBase64(blob)
.subscribe((base64) => { result = base64; });
return result;
答案 0 :(得分:0)
您可能正在碰上difference between synchronous and asynchronous programming。
简而言之,result
将立即返回,而observer.next
仅在将来的某个时间执行onload
函数后才调用function getFileContents(file) {
return new Promise((resolve, reject) => {
var reader = new FileReader();
reader.onload = evt => resolve(evt.target.result);
reader.onerror = err => reject(err);
reader.readAsText(file);
});
}
立即,几秒钟后,甚至永远不会。
因此,一旦尝试执行异步操作,就必须有效地将结果处理程序作为不同的代码块来执行。
如果我想从FileReader中获取结果,我通常会采用一种Promise方法(而不是Observable),因为我只期望一个值(或一个错误)。虽然类似,但Promises有点简单,而Observables则更强大。
一个粗略的例子:
Promise<string>
此函数将为您返回then
(包含字符串的Promise)。您仍然需要“解包”诺言以获取内部价值(使用async
或await
/ import { from } from 'rxjs';
function getFileContents(file) {
...
}
const myObservable = from(getFileContents(fileBlob));
样式的编程)。
如果您真的确定您想要一个可观察的对象,那么我可能仍会使用上面的promise函数,但应这样称呼它:
{{1}}