Какова реальная разница между pipe и подпиской? - PullRequest
0 голосов
/ 20 октября 2019

Я разрабатываю HttpInterceptor. Для разработки этого перехватчика я создаю класс обслуживания, как показано ниже:

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
    }
}

Теперь я сомневаюсь, что всякий раз, когда я использую метод .pipe() после next.handle(req), он не выдает никакой ошибки. Код выглядит следующим образом:

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(()=>{

       }));
    }
}

Но всякий раз, когда я использую .subscribe() после next.handle(), он выдает ошибку. Код выглядит следующим образом:

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() возвращает Observable, следовательно, мы можем подписать его?

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Когда вы подписываетесь, результаты возвращаются в функции

. pipe() возвращает наблюдаемое, на которое вы можете подписаться на pipe (), позволяет обрабатывать исходное наблюдаемое, чтобы при подписке на неговы получаете значение, отличное от первоначально выдаваемого наблюдаемой

Думайте об этом как о конвейере, где pipe() выполняет какую-то обработку до того, как значение достигнет того места, где вы подписали значение

1 голос
/ 20 октября 2019

Команда pipe() используется для запуска результатов из Observable через набор различных команд обработки, называемых операторами. Возможное возвращение все равно будет Наблюдаемым . Это хорошее объяснение того, что представляют собой конвейерные операторы . Моя сокращенная версия состоит в том, что конвейерный оператор - это функция, используемая для обработки результатов Observable.

Команда subscribe() используется для получения результатов Observable и возвращает Subscription .

Подписка - это не то же самое, что Наблюдение, поэтому их нельзя использовать взаимозаменяемо. Возможно, стоит отметить, что без subscribe(), конвейерные операторы никогда не будут выполняться с результатами, возвращаемыми из Observable.

...