Возможно, вы столкнулись с разницей между синхронным и асинхронным программированием .
В двух словах, result
возвращается немедленно, тогда как observer.next
вызывается только после выполнения onload
функции через некоторое время в будущем , что может произойти немедленно, через несколько секундили даже никогда.
Так что, как только вы попытаетесь сделать что-то асинхронное, вы фактически должны выполнить обработчик результата как другой блок кода.
Если бы я хотел получить результат изFileReader, я обычно использую обещание (а не Observable), так как я ожидаю только одно значение (или ошибку).В то время как подобные Обещания немного проще, в то время как 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>
(обещание, которое содержитстрока).Вам все еще нужно "развернуть" обещание, чтобы получить внутреннее значение (используя программирование в стиле then
или async
/ await
).
Если вы действительно уверены, что хотите получить наблюдаемое, тогдаЯ, вероятно, все еще использовал бы вышеупомянутую функцию обещания, но назову ее так:
import { from } from 'rxjs';
function getFileContents(file) {
...
}
const myObservable = from(getFileContents(fileBlob));