【问题标题】:rxjs5 toPromise not workingrxjs5 toPromise 不起作用
【发布时间】:2017-09-04 22:39:43
【问题描述】:

在以下示例中,toPromise 不起作用:

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

我的代码:

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));

【问题讨论】:

  • toPromise 创建的承诺永远不会得到解决 - 你认为这应该如何发生?

标签: javascript rxjs5


【解决方案1】:

已经解决https://github.com/ReactiveX/rxjs/issues/2536

toPromise本质上是observable.last().subscribe()

如果您在调用toPromise 之前添加.take(1),那么一切都会开始工作。

example.do((value)=>console.log('do!!!',value)).take(1).toPromise()

【讨论】:

  • 也应该与 first() 运算符一起使用 :)
【解决方案2】:

在较新的版本中,您必须在 pipe() 中使用 take(1)。我做了这样的代码:

async getPromise() {

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

  }

希望对某人有所帮助。

【讨论】:

  • .pipe(take(1)) 兑现了我的承诺 ng9.1.1 rxjs6.5.3
  • 谢谢!!!我正试图让它发挥作用!
猜你喜欢
  • 2019-01-13
  • 2018-06-09
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 2019-03-06
  • 2021-07-06
  • 2019-06-28
  • 2020-06-24
相关资源
最近更新 更多