在来这里之前我已经阅读了 Rxjs 的官方文档和其他一些页面,但我仍然不清楚。我的理解是这样的:
它用于“加入” 2 个可观察对象,从而获得单个可观察对象,我还看到它用于“展平”一个可观察对象(我也不是很清楚)。
现在......我有几天尝试使用 Angular 和 Node.js 和 Express 来编写用户注册表,我找到了一个我决定使用的小教程,它有以下代码:
import { Injectable, Injector } from '@angular/core';
import { HttpClient, HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError, retry, mergeMap } from 'rxjs/operators'
import { AuthenticationService } from './authentication.service';
@Injectable({
providedIn: 'root'
})
export class AppInterceptor implements HttpInterceptor {
constructor(private injector: Injector) { }
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let accessToken = "", refreshToken = ""
const tokens = JSON.parse(sessionStorage.getItem("tokens"))
if (tokens) {
accessToken = tokens.accessToken
refreshToken = tokens.refreshToken
}
let clonHttp: HttpRequest<any>
clonHttp = tokens ? req.clone({ headers: req.headers.append("Authorization", `Bearer ${accessToken}`) }) : req
let auth = this.injector.get(AuthenticationService);
return next.handle(clonHttp)
.pipe(
catchError((error: HttpErrorResponse) => {
if (error.error instanceof ErrorEvent) {
console.log("error event")
} else if (error.status == 401) {
return auth.getNewAccessToken(refreshToken)
.pipe(
retry(3),
mergeMap(
(response: any) => {
tokens.accessToken = response.accessToken
sessionStorage.setItem("tokens", JSON.stringify(tokens))
clonHttp = req.clone({ headers: req.headers.append("Authorization", `Bearer ${response.accessToken}`) })
return next.handle(clonHttp)
}
)
)
} else if (error.status == 409) {
return throwError("User not logged")
} else {
if (error.error && error.error.message) {
return throwError(error.error.message)
} else {
return throwError("Check your connection")
}
}
})
)
}
}
如果您看到,当您使用 MergeMap 运算符时,它们只会将答案传递给您(一个可观察的),或者至少这是我能看到的。我想说的是,我没有看到他们将它与 2 个可观察对象一起使用或混合 2 个可观察对象,这是我在他们的官方文档中读到的,事实上,在他们展示的示例中,他们总是使用它有 2 个可观察的。
老实说,我很难理解这个运算符,如果有人可以帮助我以简单的方式理解它,除了理解它在我之前展示的代码中的用法外,我将非常感激。提前问好。谢谢!