地图v.s。涉及承诺时的平面图
map v.s. flatmap when promise is involved
我在读书
- 运算符
map
v.s。 flatmap
- 如何将 promise 添加到可观察链中。
然后我构建了 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
并出错。
我在读书
- 运算符
map
v.s。flatmap
- 如何将 promise 添加到可观察链中。
然后我构建了 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
并出错。