我正在努力理解rxJsflatMap和concatMaprxJs 之间的区别。
我能理解的最明确的答案是这里的区别-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);
})
})
})
})
})
