13

In the following example toPromise does not work:

https://jsfiddle.net/tossp/nmf9jg32/

My code:

function getPostData() {
    return fetch('https://jsonplaceholder.typicode.com/posts/1')
    .then(res => res.json())
}
var source = Rx.Observable.fromEvent(document.body, 'click');

var example = source.concatMap(
            e => Rx.Observable.from(getPostData()), 
            (e, res, eIndex, resIndex) => res.title);

example.subscribe({
    next: (value) => { console.log('subscribe!!!',value); },
    error: (err) => { console.log('Error: ' + err); },
    complete: () => { console.log('complete'); }
});
example.do((value)=>console.log('do!!!',value)).toPromise().then((value)=>console.log('toPromise!!!',value));
John Moutafis
  • 22,254
  • 11
  • 68
  • 112
TossPig
  • 511
  • 5
  • 9

2 Answers2

27

Already solved https://github.com/ReactiveX/rxjs/issues/2536

toPromise is essentially observable.last().subscribe()

If you add .take(1) just before you call toPromise then things will start to work.

ie

example.do((value)=>console.log('do!!!',value)).take(1).toPromise()
TossPig
  • 511
  • 5
  • 9
14

In newer versions you must use take(1) inside pipe(). I did this kind of code:

async getPromise() {

    return await example
    .pipe(take(1))
    .toPromise();

  }

Hope it helps someone.

Antti Tanskanen
  • 445
  • 5
  • 9