Блокировать все http-вызовы до наблюдаемого возврата - PullRequest
0 голосов
/ 10 апреля 2020

Я работаю на перехватчике Angular. В перехватчике мне нужно перед отправкой любых не-GET-запросов отправить GET-запрос, чтобы получить заголовок с сервера, и установить этот заголовок для всех запросов. Есть ли способ, которым я могу сделать это? ниже мой псевдокод:

public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return this.sendRequest(request, next);
}

private sendRequest(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

this.httpClient.get('/my/end/point', { observe: "response" })
.subscribe(res => {
                const header = res.headers.get('SOME_HEADER');
                //set the header on request and send it 
                //first send request
                return this.processRequest(request, next);
            });
// second process request
return this.processRequest(request, next);
}

Что я вижу и ожидаю, так это то, что обработка протекает через подписчика, а затем, поскольку она еще не возвращена, она переходит ко второму оператору запроса процесса. Есть ли способ, которым я могу заблокировать все последующие http-запросы до тех пор, пока наблюдаемые результаты не будут возвращены?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

как вы хотите блокировать запросы, какими действиями?

так должен выглядеть перехватчик:

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return yourObservable.pipe(
      concatMap(someData => next.handle(request)),
    );
  }

Я создал пример для stackblitz , но вы должны быть более точными в том, как вы хотите остановить запросы и как запускать запросы

Надеюсь, я правильно понял

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (request.method === 'GET') {
      return next.handle(request);
    }

    return yourGetRequest.pipe(
      switchMap(response => {
        // add what you need from the response
        const newRequest = request.clone({ setHeaders: { ...response } });

        return next.handle(newRequest);
      }),
    );
  }
1 голос
/ 10 апреля 2020

Вам понадобится concatMap для этого, который ожидает завершения своей внутренней наблюдаемой:

return this.httpClient.get('/my/end/point', { observe: "response" })
  .pipe(
    tap(res => {
      const header = res.headers.get('SOME_HEADER');
      // Save the header somewhere so you can reuse it later ...
    }), // optional
    concatMap(res => this.processRequest(request, next)),
  );

Однако, если у вас было несколько одновременных запросов, это сделает запрос GET для '/my/end/point' для каждого из их. Более сложное решение будет использовать промежуточный общий предмет с нужным заголовком. Но реализация будет зависеть от того, какое именно поведение вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...