Наблюдаемый toPromise () получает все данные, отправленные через next () - PullRequest
0 голосов
/ 02 июля 2018

У меня есть наблюдаемая (rxjs), которая отправляет данные, используя subscriber.next(value). Как получить эти данные, если наблюдаемое преобразуется в обещание по методу toPromise()? Это вообще возможно? Или это возможно только для получения данных, переданных через полный метод наблюдаемого. Возможно, в конвейере есть опции / методы перед преобразованием в обещание, чтобы получить все данные из next() в виде массива в поле данных метода then() обещания.

getObservable().toPromise().then(data => {
  // data should contain all data sent from observable.next()
  console.log('Complete: ', data);
}, error => {
  console.log('Error: ', error);
});
  • Текущее поведение (в этом случае ожидается, но не требуется):
    data содержит данные observable.complete ().

  • Разыскиваемое поведение :
    data содержит массив всех observable.next (). Это должно быть включено с помощью опции или канала.

Пример с Observable.range ():

let observer = Rx.Observable.range(1,5).toPromise().then(data => {
  console.log('Completed: ', data);
}, error => {
  console.log('Error: ', error);
});

Выход:

Completed: 5

Требуются:

Completed: [1, 2, 3, 4, 5]

Я не уверен, возможно ли это вообще.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Уменьшите , прежде чем дать обещание

const source = Rx.Observable.of(1, 2, 3, 4);
const example = source.reduce((acc,val) => acc.concat(val), []);

example.toPromise().then((data) => {
    alert(data);
});
0 голосов
/ 02 июля 2018

Из документов:

Возвращает (Обещание): Обещание, соответствующее ES2015, которое содержит последнее значение из наблюдаемой последовательности. Если наблюдаемая последовательность ошибочна, то Обещание будет в отклоненной стадии. Если последовательность пуста, обещание не будет выполнено.

Так что возвращенное обещание будет разрешено только после завершения последовательности, возьмите следующий код, например

var source = new rxjs.Subject();

var promise = source.asObservable().toPromise();

promise.then(x => console.log(`Promise: ${x}`));

source.subscribe(x => console.log(`Observable ${x}`));

Array.of(1, 2, 3).forEach(i => source.next(i));

source.complete('Complete');
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.2.1/rxjs.umd.js"></script>

Как видите, promise разрешается с последним выданным значением, но только после завершения последовательности .

...