地图v.s。涉及承诺时的平面图

map v.s. flatmap when promise is involved

我在读书

然后我构建了 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()));
.flatMap(x => Rx.Observable.timer(500).map((x) => x))

returns "0", "0", "0" 因为 timer 在 500 毫秒后发出 0 并且 map 将该值作为输入 x 并且return 用 (x) => x 代替它。在上一行中,x 没有在 map 中重新声明,所以它来自 flatMap.

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

给出错误,因为承诺会发出 then 回调的 return 值。那是 console.log(s) ,它是一个语句,计算结果为未定义。所以 flatMap 给出了一个 undefined,undefined,undefined 的 Observable。当第一个到达 subscribe 时,它尝试执行 undefined.toString 并出错。