Задержка наблюдаемого - PullRequest
0 голосов
/ 13 апреля 2020

Я работаю над одним сценарием, например «Требуется, чтобы один Dummy получал вызов Api перед каждым вызовом Post в приложении».

Примечание: 1. Фактический почтовый вызов должен начинаться один раз после завершения фиктивного вызова. 2. Требуется решить проблему путем редактирования кода только в служебном файле.

Вот моя проблема,

Component.ts

this._service.dopost().subscribe(
  data => { console.log(data); });

Service.ts

   dopost() {
         this._http.get(dammyUrl, body, {
            observe: "response",
            headers: headers 
          }).subscribe((responce)=>{
            return this._http.post(url, body, {
               observe: "response",
               headers: headers 
            });
          });

  } 

Стек Blitz Link

https://stackblitz.com/edit/angular-qa1ztz

Ответы [ 2 ]

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

Вам необходимо использовать SwitchMap Operator

Сопоставить с наблюдаемыми, завершить предыдущие внутренние наблюдаемые, излучать значения.

dopost():SecondResponseType  {
    return this._http.get<InitialResponseType>('dammyUrl', {}, {
        observe: 'response',
        headers: {} 
        }).pipe(
            switchMap((initialResponse: InitialResponseType) => this._http.post<SecondResponseType>('url', {}, {
                observe: "response",
                headers: {} 
            }))
        });
}

Как скоро поскольку вы подписываетесь на depost() запросы метода 2 будут выполняться последовательно.

, если вы используете HttpClientModule , ваш метод выглядит проще. Практически, HttpClientModule является оберткой вокруг HttpModule

dopost(): Observable<SecondResponseType>  {
    return this._http.get<SecondResponseType>('dammyUrl').pipe(
        switchMap((initialResponse: InitialResponseType) => this._http.post<SecondResponseType>('url'))
    });
}
0 голосов
/ 13 апреля 2020

Насколько я понимаю, вам нужно в этом случае flatMap Rx JS оператор . См. Пример ниже:

dopost() {
      return this._http.get(dammyUrl, body, {
         observe: "response",
         headers: headers 
       }).pipe(flatMap(responce=>{
         return this._http.post(url, body, {
            observe: "response",
            headers: headers 
          });
       }));
}

И вы должны подписаться на метод dopost, как описано в вопросе.

...