管道和订阅之间的实际区别是什么?

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() 在值到达您订阅值的位置之前进行某种处理