如何导出可观察值并分配给变量?

时间:2019-05-23 23:24:57

标签: javascript reactjs rxjs redux-observable

我正在尝试为变量分配可观察值,但是它返回未定义。

有没有办法将此值分配给订阅方法之外的变量?

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;

1 个答案:

答案 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)。您仍然需要“解包”诺言以获取内部价值(使用asyncawait / import { from } from 'rxjs'; function getFileContents(file) { ... } const myObservable = from(getFileContents(fileBlob)); 样式的编程)。

如果您真的确定您想要一个可观察的对象,那么我可能仍会使用上面的promise函数,但应这样称呼它:

{{1}}