首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >http-等待订阅完成获取数据的拦截器

http-等待订阅完成获取数据的拦截器
EN

Stack Overflow用户
提问于 2019-05-25 22:31:13
回答 1查看 2.4K关注 0票数 3

我有一个HTTP拦截器。后端API期望自定义headers,其值在应用初始化和其他操作期间存储在indexdb中。因此,我需要获取这些值并将其传递给每个请求。但到目前为止,由于拦截器不等待订阅完成执行并发送不带自定义头的请求,因此未能做到这一点。

intercetpor确实获得了当前保存的或默认的标头,但为时已晚,因为请求通过时没有标头。

indexdb.service.ts:

代码语言:javascript
复制
@Injectable()
export class IndexDBService {
  /*
    Handles configuration of the app:
        reading current configuration
        saving configuration
    */

  private pouch: any;

  constructor() {
    this.pouch = new PouchDB("config", {
      auto_compaction: true
    });
  }

  currentConfig(): Observable<any> {
    /*
      Return the current configuration saved in the database
    */
    let vm = this;
    return new Observable(observer => {
      vm.pouch.get("info", function(err, doc) {
        if (err) {
          console.log("config read error ", err);
          // create a default one
            configOptions={'header1': '1','header2':2}
           observer.next(configOptions);
        } else {

          observer.next(doc);
        }
      });
    });
  }
}

interceptor.ts

代码语言:javascript
复制
import { Injectable } from "@angular/core";
import {
  HttpEvent,
  HttpInterceptor,
  HttpHandler,
  HttpRequest,
  HttpHeaders
} from "@angular/common/http";
import { Observable } from "rxjs";
import { IndexDBService } from "../services/indexdb.service";

@Injectable()
export class InterceptAPICalls implements HttpInterceptor {
  constructor(private indexdbService: IndexDBService) {}

  intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {

    this.indexdbService.currentConfig().subscribe(configData => {
      console.log(configData); // ==> does work great. I am getting data right
      req = req.clone({
        headers: new HttpHeaders({

          "X-Header1": configData["header1"],
          "X-Header2": configData["header2"]
        })

      });
      return next.handle(req); // want this one to return always
    });
    // below is cos the app won't compile and it returns immediately
    return next.handle(req);
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-25 23:04:09

intercept函数只需要返回一个observable。因此,您开始向currentConfig()发出请求,然后在发出配置时切换到下一个拦截器。

代码语言:javascript
复制
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return this.indexdbService
        .currentConfig()
        .pipe(
            first(),
            mergeMap(configData => {
                req = req.clone({
                    headers: new HttpHeaders({
                        'X-Header1': configData['header1'],
                        'X-Header2': configData['header2']
                    })
                });
                return next.handle(req);
            })
        );
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56305749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档