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

标签 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;

最佳答案

您可能遇到了 difference between synchronous and asynchronous programming .

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

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

如果我想从 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> (包含字符串的 promise )。不过,您仍然需要“打开”promise 以获得内部值(使用 thenasync/await 风格的编程)。

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

import { from } from 'rxjs'; 

function getFileContents(file) {
  ...
}

const myObservable = from(getFileContents(fileBlob));

关于javascript - 如何导出可观察值并分配给变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56284070/

相关文章:

javascript - 为什么 Map 在 chrome/node 中不能子类化?

javascript - LastModified 日期格式符合英国标准

javascript - 将鼠标悬停在 Chrome 上的 React 中数字输入的递增/递减值按钮上会导致持续增加

javascript - react native : functions are not valid as a react child . 如果您返回组件而不是 <component/>,则可能会发生这种情况

javascript - 如何在函数 rxjs 中使用 observable 和管道?

javascript - 使用 RxJs groupBy 以对象作为键

javascript - 当时间不是全日全日历时,无法调整事件大小

javascript - React - 调用父组件中的函数来访问状态

javascript - 如何让 Observable.flatMap 等待解析

javascript - 在 Angular 中重用部分和 Controller