我有一个可观察的(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]
我不确定这是否可能。
答案 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
解析为最后发出的值,但仅在序列完成后。