Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何导出可观测值并分配给变量?_Javascript_Reactjs_Rxjs_Redux Observable - Fatal编程技术网

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

Javascript 如何导出可观测值并分配给变量?,javascript,reactjs,rxjs,redux-observable,Javascript,Reactjs,Rxjs,Redux Observable,我试图给变量分配一个可观测值,但它返回未定义的值 有没有办法将此值分配给subscribe方法之外的变量 new Observable((observer) => { const reader = new FileReader(); reader.onload = () => { observer.next(reader.result); observer.complete(); }; reader.onerror = e => observer

我试图给变量分配一个可观测值,但它返回未定义的值

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

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;

你可能遇到了麻烦

简而言之,
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);
  });
}
此函数将返回一个
承诺
(包含字符串的承诺)。您仍然需要“打开”承诺以获得内部值(使用
然后
异步
/
等待
-style编程)

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

import { from } from 'rxjs'; 

function getFileContents(file) {
  ...
}

const myObservable = from(getFileContents(fileBlob));


谢谢乔诺,承诺是更好的方法。我声明了一个值
let result=''
然后使用
then
像这样展开数据:
getFileContents(blob)。然后(base64=>result=base64)但当我在控制台中记录我的
结果
变量时,它仍然显示空字符串!是的,它将返回,因为函数在
然后
处理程序中分配其值之前返回
结果。我建议您在函数和
处理程序中的一些地方添加一些
控制台。记录
调用,然后查看代码的运行顺序。