可观察的toPromise()获取通过next()发送的所有数据

时间:2018-07-02 14:55:07

标签: javascript typescript rxjs observable es6-promise

我有一个可观察的(rxjs),它使用subscriber.next(value)发送数据。 如果通过方法toPromise()将可观察对象转换为Promise,如何获取这些数据?那有可能吗?还是只能通过可观察对象的完整方法获得数据。 在转换为Promise之前,在Promise的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 :(得分:2)

Reduce,然后再兑现承诺

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

example.toPromise().then((data) => {
    alert(data);
});

答案 1 :(得分:0)

从文档中

  

返回(承诺):符合ES2015的承诺,其中包含Observable序列中的最后一个值。如果可观察序列有误,则Promise将处于拒绝阶段。如果序列为空,则Promise不会解决。

因此,返回的promise仅在序列完成后才能解析,以下面的代码为例

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解析为最后发出的值,但仅在序列完成后