【问题标题】:Unable to subscribe data from Interceptor无法从拦截器订阅数据
【发布时间】:2018-10-12 08:00:40
【问题描述】:

在我的AppComponent.ts 文件中,我使用HttpClient 进行了HTTP GET 调用。

import { Component } from '@angular/core';
import { Observable, Subscriber, Unsubscribable } from 'rxjs';
import { HttpClient } from '@angular/common/http';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app';
  ob: Observable<any> = null;

  constructor(private httpClient: HttpClient) {

    httpClient.get("").subscribe((response) => {
      console.log(response);
    });
  }
}

然后我还有一个拦截器,它拦截 Http 调用并返回一些静态数据(比如说缓存)。

import { Injectable } from "@angular/core";
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http';
import { Observable, of } from "rxjs";

@Injectable()
export class CustomHttpInterceptor implements HttpInterceptor {
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<any> {
        return of({});
    }
}

但是AppComponent.ts 文件中的订阅没有收到任何响应。事实上,订阅成功或错误功能甚至都没有被击中。 也没有控制台错误。有人知道这里发生了什么吗?

注意 我已将返回类型从 Observable&lt;HttpEvent&lt;any&gt;&gt; 更改为 Observable&lt;any&gt;,因为 TypeScript 无法将 Observable&lt;{}&gt; 转换为 Observable&lt;HttpEvent&lt;any&gt;&gt;

【问题讨论】:

    标签: rxjs angular6 interceptor angular-httpclient rxjs6


    【解决方案1】:

    您的缓存响应需要是HttpResonse 类型,但更准确地说,它需要是HttpEvent 类型,其中包括HttpResponse&lt;T&gt; 类:

    const response = new HttpResponse<object>({
      body: {},
      status: 200
    })
    
    return of(response);
    

    虽然这有点未经测试,但不确定 body 是否需要是可解析的 json 字符串才能使其工作,所以:body: '{}',但这是你可以尝试的。 :)

    【讨论】:

    • 太棒了。这个问题把我推到了顶楼的边缘。我希望我能有机会给你买杯咖啡或啤酒:)。
    • @Sandy 为什么不两者兼而有之? ;) 无论如何,我希望您不必制作正文的可解析 json 字符串,对吧?
    • 哈哈...是的...都在我身上。是的,body 可以是对象,不需要是字符串。
    猜你喜欢
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2014-08-23
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多