我正在学习
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()));
答案 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
并出错。