管道和订阅之间的实际区别是什么?
What is the actual difference between pipe and subscribe?
我正在开发一个 HttpInterceptor。为了开发这个拦截器,我正在创建一个服务 class,如下所示:
import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
export class InterceptorClass implements HttpInterceptor{
intercept(req: HttpRequest<any>, next: HttpHandler){
debugger
req= req.clone({
headers: req.headers.append('currentPlace','New Delhi')
});
return next.handle(req); //Doubt in this line
}
}
现在我的疑问是,每当我在 next.handle(req)
之后使用 .pipe()
方法时,它都不会显示任何错误。代码如下:
import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
export class InterceptorClass implements HttpInterceptor{
intercept(req: HttpRequest<any>, next: HttpHandler){
debugger
req= req.clone({
headers: req.headers.append('currentPlace','New Delhi')
});
return next.handle(req).pipe(tap(()=>{
}));
}
}
但是每当我在 next.handle()
之后使用 .subscribe()
时,它就会出错。
代码如下:
import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
import { map, tap } from 'rxjs/operators';
export class InterceptorClass implements HttpInterceptor{
intercept(req: HttpRequest<any>, next: HttpHandler){
debugger
req= req.clone({
headers: req.headers.append('currentPlace','New Delhi')
});
return next.handle(req).subscribe((data)=>{
});
}
}
订阅时出现的错误是:
Type '(req: HttpRequest<any>, next: HttpHandler) => Subscription' is not assignable to type '(req: HttpRequest<any>, next:
HttpHandler) => Observable<HttpEvent<any>>'.
Type 'Subscription' is missing the following properties from type 'Observable<HttpEvent<any>>': _isScalar, source, operator, lift, and 6 more.
为什么当我们从 subscribe()
到 next.handle()
时报错,因为我读到 next.handle()
returns 一个 Observable,因此我们可以订阅它?
pipe()
命令用于 运行 通过一系列不同的处理命令(称为运算符)来自 Observable 的结果。最终的 return 仍然是 Observable. This is a good explanation of what pipeable operators are。我的简化版是管道运算符是一个用于处理 Observable 结果的函数。
subscribe()
命令用于获取 Observable 的结果,它 return 是一个 Subscription。
订阅与可观察对象不同,这就是为什么它们不能互换使用的原因。可能值得注意的是,如果没有 subscribe()
,管道运算符将永远不会对从 Observable 编辑的结果执行 return。
订阅时,结果在函数内返回
pipe()
returns 您可以订阅的可观察对象
pipe() 允许你处理原始的可观察对象,这样当你订阅它时,你会得到一个不同于最初由可观察对象发出的值
把它想象成一个管道,其中 pipe()
在值到达您订阅值的位置之前进行某种处理
我正在开发一个 HttpInterceptor。为了开发这个拦截器,我正在创建一个服务 class,如下所示:
import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
export class InterceptorClass implements HttpInterceptor{
intercept(req: HttpRequest<any>, next: HttpHandler){
debugger
req= req.clone({
headers: req.headers.append('currentPlace','New Delhi')
});
return next.handle(req); //Doubt in this line
}
}
现在我的疑问是,每当我在 next.handle(req)
之后使用 .pipe()
方法时,它都不会显示任何错误。代码如下:
import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
export class InterceptorClass implements HttpInterceptor{
intercept(req: HttpRequest<any>, next: HttpHandler){
debugger
req= req.clone({
headers: req.headers.append('currentPlace','New Delhi')
});
return next.handle(req).pipe(tap(()=>{
}));
}
}
但是每当我在 next.handle()
之后使用 .subscribe()
时,它就会出错。
代码如下:
import { HttpInterceptor, HttpRequest, HttpHandler } from '@angular/common/http';
import { map, tap } from 'rxjs/operators';
export class InterceptorClass implements HttpInterceptor{
intercept(req: HttpRequest<any>, next: HttpHandler){
debugger
req= req.clone({
headers: req.headers.append('currentPlace','New Delhi')
});
return next.handle(req).subscribe((data)=>{
});
}
}
订阅时出现的错误是:
Type '(req: HttpRequest<any>, next: HttpHandler) => Subscription' is not assignable to type '(req: HttpRequest<any>, next:
HttpHandler) => Observable<HttpEvent<any>>'.
Type 'Subscription' is missing the following properties from type 'Observable<HttpEvent<any>>': _isScalar, source, operator, lift, and 6 more.
为什么当我们从 subscribe()
到 next.handle()
时报错,因为我读到 next.handle()
returns 一个 Observable,因此我们可以订阅它?
pipe()
命令用于 运行 通过一系列不同的处理命令(称为运算符)来自 Observable 的结果。最终的 return 仍然是 Observable. This is a good explanation of what pipeable operators are。我的简化版是管道运算符是一个用于处理 Observable 结果的函数。
subscribe()
命令用于获取 Observable 的结果,它 return 是一个 Subscription。
订阅与可观察对象不同,这就是为什么它们不能互换使用的原因。可能值得注意的是,如果没有 subscribe()
,管道运算符将永远不会对从 Observable 编辑的结果执行 return。
订阅时,结果在函数内返回
pipe()
returns 您可以订阅的可观察对象
pipe() 允许你处理原始的可观察对象,这样当你订阅它时,你会得到一个不同于最初由可观察对象发出的值
把它想象成一个管道,其中 pipe()
在值到达您订阅值的位置之前进行某种处理