我正在努力理解rxJsflatMap
和concatMap
rxJs 之间的区别。
我能理解的最明确的答案是这里的区别-concatmap-and-flatmap
所以我自己去尝试了一些东西。
import "./styles.css";
import { switchMap, flatMap, concatMap } from "rxjs/operators";
import { fromFetch } from "rxjs/fetch";
import { Observable } from "rxjs";
function createObs1() {
return new Observable<number>((subscriber) => {
setTimeout(() => {
subscriber.next(1);
subscriber.complete();
}, 900);
});
}
function createObs2() {
return new Observable<number>((subscriber) => {
setTimeout(() => {
subscriber.next(2);
//subscriber.next(22);
//subscriber.next(222);
subscriber.complete();
}, 800);
});
}
function createObs3() {
return new Observable<number>((subscriber) => {
setTimeout(() => {
subscriber.next(3);
//subscriber.next(33);
//subscriber.next(333);
subscriber.complete();
}, 700);
});
}
function createObs4() {
return new Observable<number>((subscriber) => {
setTimeout(() => {
subscriber.next(4);
subscriber.complete();
}, 600);
});
}
function createObs5() {
return new Observable<number>((subscriber) => {
setTimeout(() => {
subscriber.next(5);
subscriber.complete();
}, 500);
});
}
createObs1()
.pipe(
flatMap((resp) => {
console.log(resp);
return createObs2();
}),
flatMap((resp) => {
console.log(resp);
return createObs3();
}),
flatMap((resp) => {
console.log(resp);
return createObs4();
}),
flatMap((resp) => {
console.log(resp);
return createObs5();
})
)
.subscribe((resp) => console.log(resp));
console.log("hellooo");
我在这里用过那个游乐场的例子
问题
1) 据我了解,flatMap 的使用应该混合输出,以便控制台日志类似于(1、3、2、4、5)。我已经尝试了 30 多次并且总是在同一行(1、2、3、4、5)
我做错了什么或有什么不明白的错误?
2)
如果打开createObs2()
并且createObs3()
您删除注释并包含具有多个发出事件的代码,那么事情就会变得混乱。即使您更改为 concatMap ,它也会使事情变得混乱,结果也很复杂。我期望只出现一次的多个数字多次出现。结果可能是 (1, 2, 33, 3, 2, 22, 3, 33, 4, 5, 4, 3, 4, 5) 为什么会这样?
我如何在操场上测试这个例子。我只从最后一个 console.log("hello") 中删除了 1 个字母。只有一个更改,例如 console.log("heloo") 然后被观察并再次编译项目并在控制台中打印输出。
编辑:我去 flatMap 和 concatMap 的原因是使用 http 库找到一个替代嵌套订阅的角度。
createObs1().subscribe( (resp1) => {
console.log(resp1);
createObs2().subscribe( (resp2) => {
console.log(resp2);
createObs3().subscribe( (resp3) => {
console.log(resp3);
createObs4().subscribe( (resp4) => {
console.log(resp4);
createObs5().subscribe( (resp5) => {
console.log(resp5);
})
})
})
})
})