代码之家  ›  专栏  ›  技术社区  ›  goat

角度http侦听器-中止响应

  •  2
  • goat  · 技术社区  · 6 年前

    有没有一种方法可以使用angular的http拦截器来截获响应,并将其删除/丢弃,以便将来不会执行下游回调?

    我希望它的行为能够使控制台和。执行日志。

    this.http.get('/foo').subscribe(
        data => console.log("success", data),
        err => console.log("fail.", err)
    );
    

    我看到过修改响应或用null或其他一些sentinel值替换响应的示例,但我宁愿不这样做,因为这样所有成功/失败处理程序都必须查找sentinel,这降低了使用拦截器处理某些响应的有用性。

    我有一种感觉,这更多的是一个rxjs问题,而不是一个角度拦截器问题,但我只是对rx不够熟悉,还不能确定。

    如果有关系的话,我用的是angular 5.1

    2 回复  |  直到 6 年前
        1
  •  1
  •   Harry Ninh    6 年前

    您可以使用 Observable.empty 在不发出任何数据的情况下完成流。将其与 HttpInterceptor ,将其链接到 next.handle :

    return next.handle(req).switchMap(() => Observable.empty());
    

    我不知道该怎么做 Promise 很抱歉

        2
  •  0
  •   goat    5 年前

    我找到了另一个方法,可以阻止subscribe()回调被调用。下面是一个示例拦截器,如果HttpResponse中存在某个http头,它将避免调用下游订阅者。

    不过,请注意,这种方法并不是真的“扔掉响应”。相反,它会无限期地延迟响应。如果您有使用计时器的代码(例如,如果在60秒内未收到成功或错误响应,则某些代码将出错),这可能是一个问题,因为这正是此方法的工作方式-它只是从不响应。

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return next.handle(req).pipe(
            switchMap((event: HttpEvent<any>) => {
    
                // In this example, I only care about checking valid http responses.
                // But, if you also want to inspect errors, you might consider checking for HttpResponseBase or HttpErrorResponse
                if (event instanceof HttpResponse) {
    
                    // Check if this response has a certain http response header set.
                    // If so, we throw the response away.
                    if (event.headers.has('my-custom-header')) {
                        // We intentionally return an Observable that will never complete. This way,
                        // downstream subscribers will never receive anything, and any .toPromise()
                        // conversions that may be present will also never be invoked because toPromise() only
                        // gets invoked when the Observable completes.
                        // It doesn't actually throw the response away, but rather, it makes the subscribers wait forever, so they will never get a response.
                        // Be careful if you use timeouts.
                        return new Subject<HttpEvent<any>>();
                    }
    
                }
    
                // The default case - we pass the response back through unmodified.
                return Observable.of(event);
            })
        );
    }
    
    // These console.logs will not be called
    this.http.get('/foo').subscribe(
        data => console.log("success", data),
        err => console.log("fail.", err)
    );
    
    // Neither will these
    this.http.get('/foo').toPromise(
        data => console.log("success", data),
        err => console.log("fail.", err)
    );