如何导出可观察值并分配给变量?
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" 承诺来获得内部值(使用 then
或 async
/await
风格的编程)。
如果你真的确定你想要一个 observable,那么我可能仍然会使用上面的 promise 函数,但是这样调用它:
import { from } from 'rxjs';
function getFileContents(file) {
...
}
const myObservable = from(getFileContents(fileBlob));
我正在尝试将一个可观察值赋给一个变量,但它 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" 承诺来获得内部值(使用 then
或 async
/await
风格的编程)。
如果你真的确定你想要一个 observable,那么我可能仍然会使用上面的 promise 函数,但是这样调用它:
import { from } from 'rxjs';
function getFileContents(file) {
...
}
const myObservable = from(getFileContents(fileBlob));