地图v.s.涉及承诺时的flatmap

时间:2017-06-08 19:03:58

标签: rxjs reactivex

我正在学习

  • operator map vs.s. flatmap
  • 如何将承诺添加到可观察链中。

然后我构建了4个不同版本的var source,如下所示。 版本1,3工作正常,而版本2,4则奇怪地失败。

我的代码也已添加到=> js bin

有人能告诉我的代码有什么问题吗?

谢谢, 僖

console.clear();
var p = new Promise((resolve, reject) => {
  setTimeout( () => {
    resolve('resolved!');
  } , 1000);
});

var source = Rx.Observable.interval(200).take(3)
.flatMap(x => Rx.Observable.timer(500).map(() => x))   //version 1, works OK
// .flatMap(x => Rx.Observable.timer(500).map((x) => x))  // version 2, not OK, returns => 0, 0, 0
// .map(x => p.then( s => console.log(s)));                  // version 3, works OK 
// .flatMap(x => p.then( s => console.log(s)));                  // version 4, not OK, error occurs


source.subscribe(x => console.log(x.toString()));

1 个答案:

答案 0 :(得分:3)

.flatMap(x => Rx.Observable.timer(500).map((x) => x))

返回" 0"," 0"," 0"因为timer在500毫秒后发出0而map将该值作为输入x并以(x) => x返回。在上一行中,x未重新声明map,因此它来自flatMap

.flatMap(x => p.then( s => console.log(s)));

发出错误,因为promise会发出then回调的返回值。作为语句的console.log(s)评估为未定义。所以flatMap给出了一个Obfinedable undefined,undefined,undefined。当第一个到达subscribe时,它会尝试undefined.toString并出错。