在此示例中,switchMap给出http响应,但是当使用map时,将返回Observable。我相信这与'flattening'switchMap确实有关,但是仍然不了解switchMap在幕后为产生http响应结果正在做什么。
import{Component, OnInit} from '@angular/core';
import {HttpClient} from '@angular/common/http';
import { of, from, Observable, forkJoin } from 'rxjs';
import { map, mergeMap, switchMap, tap, flatMap} from 'rxjs/operators';
@Component({
selector: 'star-wars',
template: ``,
})
export class StarWars {
private peopleUrl = 'https://swapi.co/api/people/';
constructor(private http: HttpClient) {}
ngOnInit() {
of(1)
.pipe(
map(() => this.http.get('https://swapi.co/api/people/1')),
// produces Observable {_isScalar: false, source: {…}
switchMap(() => this.http.get('https://swapi.co/api/people/1')),
// produces http response {name: "Luke Skywalker", height: "172", mass: "77", hair_color: "blond"…}
)
.subscribe(res => {
console.log(res)
})
}
}
任何关于switchMap在这里做什么以产生这种不同结果的澄清将不胜感激。
Observables中的“扁平化”类似于您可能已经熟悉的扁平化数组的概念。
例如:
[[0], [1, 2], [3]].flatten()
// output [0, 1, 2, 3]
一般而言,展平意味着获取值的类型类型(例如,值的数组)并返回值的类型(例如,值的数组)。
类型的类型有时称为高阶类型(例如,高阶函数是函数返回函数,高阶Observable是Observable的Observable)。因此,展平会将高阶类型转换为一阶类型。
使用TypeScript编写flatten
的函数具有以下签名:
flatten(source: Type<Type<Value>>): Type<Value>
在RxJS中,等效于flatten
ismergeAll
运算符:
of(of(0), of(1, 2), of(3)).pipe(mergeAll())
// produce Observable<number> -> [0, 1, 2, 3]
经常将map
and组合使用,尽管名称可以不同,但主要概念是相同的-将映射和展平作为一个动作进行。flatten
flatMap
在数组上下文中,而不是:
[0, 1, 2, 3].map(x => Array(x).fill(x)).flatten()
// [[], [1], [2, 2], [3, 3, 3]].flatten()
// output: [1, 2, 2, 3, 3, 3]
我们可以使用:
[0, 1, 2, 3].flatMap(x => Array(x).fill(x))
RxJS的许多运算符充当flatMap
:
mergeMap
-同时将Observable展平,因此输入和输出值可能具有不同的顺序concatMap
-一次连续地将Observables一次展平,因此输入和输出值的顺序相同switchMap
-使“可观察”变平,但仅提供最新值通常,这些flatMap
类型的运算符将简单地调用subscribe
从映射函数返回的Observable,并将为我们管理基础订阅。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句