Как вызвать несколько api и подписаться на angular 6?

В моем приложении для вызова всех запросов POST я использовал service.

Когда я получаю от сервера код специфический(E.x: 401), я вызываю API для получения нового токена.

Пока не будет получен другой токен, если есть какой-либо другой вызов API, я сохраняю все эти запросы в массиве. Это могут быть запросы ппg>. На данный момент предположим, что во время вызова API newToken выполняется 3 вызова API.

Как только я получу новый токен, я должен передать его во все последующие API. Теперь мне нужно выполнить все ожидающие запросы API и передать данные для их соответствующих вызовов.

Пример кода:

api.service.ts

POST(URL , param){
   return new Observable<any>(observer => {

  let headers = new HttpHeaders({
    'Content-Type': 'Content-Type': 'application/json'
  });

  let options = {
    headers: headers
  };

  this.http.post(URL, param, options)
        .subscribe(data => {
          var apiRes: any = data;                                       
          this.inValidSession();
          observer.next();
          observer.complete();              
  }
  ......

  //  For execute pending request I have set this 

  for (let i = 0; i < this.queue.length; i++) {                          
        this.REPOST(this.queue[i].param, this.queue[i].url).subscribe((queueResponse) => {             
          observer.next(queueResponse);
          observer.complete();
          this.queue.shift();                      
       });
   }
}

user.component.ts

ngOnInit(){
    this.getUserData();        
    this.getProductData();
}

getUserData(){
   this.apiService.post({},'/apiName').subscribe((response) => {
       console.log(response);
   })
}

getProductData(){
   this.apiService.post({},'/apiName2').subscribe((response) => {
       console.log(response);
   })
}

Проблема в том, что когда я выполняю все ожидающие обработки API, я получаю данные в консоли. Но не subscribe из служебного файла в соответствующую функцию файла .ts.

Примечание. Я получаю данные по подписке только в одной функции, а не в каждой. Другими словами, я получаю оба API res в функции getProductData(). Не знаю почему.

Пожалуйста, помогите мне, если у кого-то есть решение.

forkJoin() поможет сделать несколько звонков одновременно
Sivakumar Tadisetti 26.10.2018 08:21

@ JavascriptLover-SKT Я попытался использовать это и получил данные в консоли в виде массива. Но тогда мой subscribe не работает. Это проблема.

khushboo 26.10.2018 08:49

Также это будет полезно, когда я напрямую звоню с ts. Но я использовал сервисы для повторного использования кода.

khushboo 26.10.2018 08:52
2
3
27 868
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете использовать

forkJoin()

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

например

    forkJoin(Service1.call1, 
     Service2.call2)
    .subscribe(([call1Response, call2Response]) => {

Где service1 и service2 - это службы с функциями ccall1 и call2, которые имеют тип returnObservable.

Вы можете найти больше Здесь

Я уже пробовал использовать forkJoin, но он возвращает все данные за один раз. И тогда я не могу вернуть значение ts. Я имею в виду, что когда я использовал forkJoin, мой subscribe не работал.

khushboo 26.10.2018 08:48

вы можете просто вернуть forkJoin (Service1.call1, Service2.call2) или, если вы подписываетесь на него, вы должны вернуть результат в виде наблюдаемого: forkJoin (Service1.call1, Service2.call2) .subscribe (() => // вернуть новый наблюдаемый, содержащий результат)

Vinaayakh 30.10.2018 07:37

Используйте zip lib из rxjs

import { zip } from "rxjs";

myFun() {    
   zip(service.api1, service.api2)
       .subscribe(([response1, response2]) => {
          console.log(response1);
          console.log(response2);
    })
}

Простой метод

использовать forkjoin ()

public sample(): Observable<any[]>
{

let call1=this.http.get(this._url+'/v1/sample1')

let call2=this.http.get(this._url+'/v1/sample2')

let call3=this.http.get(this._url+'/v1/sample3')

return forkJoin([call1, call2,call3]);

}

Другие вопросы по теме