Javascript 如何导出可观测值并分配给变量?
我试图给变量分配一个可观测值,但它返回未定义的值 有没有办法将此值分配给subscribe方法之外的变量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
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)代码>但当我在控制台中记录我的结果
变量时,它仍然显示空字符串!是的,它将返回,因为函数在然后处理程序中分配其值之前返回结果。我建议您在函数和处理程序中的一些地方添加一些控制台。记录调用,然后查看代码的运行顺序。