Как экспортировать значение наблюдаемой и присвоить переменной? - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь присвоить значение наблюдаемой переменной, но она возвращает Undefined.

Есть ли способ присвоить это значение переменной вне метода подписки?

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;

1 Ответ

0 голосов
/ 24 мая 2019

Возможно, вы столкнулись с разницей между синхронным и асинхронным программированием .

В двух словах, 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));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...