javascript - HttpInterceptor som anropar en annan tjänst inuti en interceptor och väntar på svar


Jag måste anropa en annan tjänst i en interceptor om ett visst villkor uppfylls och jag vill att den ursprungliga tjänsten ska vänta tills den nya tjänsten är klar. Min första lösning var att använda tap:

intercept(req: HttpRequest<any>, options: any, next: HttpServiceHandler)
  : Observable <HttpEvent<any>> {
    return next.handle(req, options).pipe(
      tap((event: HttpEvent<any>) => {
        if (event instanceof HttpResponse && event.ok && event.body) {
          const productsToGet = [...]
          if (* condition *) {
            const resourceService = this.injector.get(ResourceService);
            return resourceService.getProducts(productsToGet);
          }
        }
      })
    );
  }

Men det fungerade uppenbarligen inte som jag ville eftersom den ursprungliga metoden avslutades innan getProducts var färdig. Då använde jag lösningen från denna tråd med switchMap:

return next.handle(req, options).pipe(
  filter((event: HttpEvent<any>) => (event instanceof HttpResponse && event.ok && event.body)),
  switchMap((event: HttpResponse<any>) => {
    const productsToGet = [...]
    if (* condition *) {
      const resourceService = this.injector.get(ResourceService);
      return resourceService.getProducts(productsToGet).pipe(
        mapTo(event)
      )
    } else {
      return of(event);
    }
  })
);

Men nu får jag ett fel:

Oupptäckt (i löfte) EmptyError: inga element i sekvensen.

Kan du berätta för mig om min lösning är giltig och vad jag ska göra för att få den att fungera?

Fullständig felstack:

> Error: Uncaught (in promise): EmptyError: no elements in sequence
    at resolvePromise (zone.js:852)
    at resolvePromise (zone.js:809)
    at zone.js:913
    at ZoneDelegate.push.../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
    at Object.onInvokeTask (core.js:26754)
    at ZoneDelegate.push.../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:422)
    at Zone.push.../node_modules/zone.js/dist/zone.js.Zone.runTask (zone.js:195)
    at drainMicroTaskQueue (zone.js:601)
    at ZoneTask.push.../node_modules/zone.js/dist/zone.js.ZoneTask.invokeTask [as invoke] (zone.js:502)
    at invokeTask (zone.js:1693)

Svar #1

Det visade sig att det var ett problem med filtret. Observables från svar som hade filtrerats bort returnerades inte från interceptorn. Därför tog jag bort filtret och lade till det inuti switchMap, och returnerade of(event) för svar som inte uppfyller filtervillkoren.