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

How to export the value of an observable and assign to a variable?

我正在尝试将一个可观察值赋给一个变量,但它 returns 未定义。

有没有办法将这个值赋给订阅方法之外的变量?

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;

你可能会运行变成difference between synchronous and asynchronous programming

简而言之,result立即返回,而observer.next仅在onload函数执行后调用将来某个时间 可能立即、几秒钟后,甚至永远不会。

因此,一旦您尝试执行异步操作,实际上您必须将结果处理程序作为不同的代码块来执行。

如果我想从 FileReader 获得结果,我通常会采用 promise 方法(而不是 Observable),因为我只期望一个值(或一个错误)。虽然相似,但 Promises 更简单一些,而 Observables 更强大。

一个粗略的例子:

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);
  });
}

此函数将返回一个 Promise<string>(包含字符串的承诺)。你仍然需要 "unwrap" 承诺来获得内部值(使用 thenasync/await 风格的编程)。

如果你真的确定你想要一个 observable,那么我可能仍然会使用上面的 promise 函数,但是这样调用它:

import { from } from 'rxjs'; 

function getFileContents(file) {
  ...
}

const myObservable = from(getFileContents(fileBlob));