如何调用多个API并订阅angular 6?

时间:2018-10-26 06:09:42

标签: angular request observable

在我的应用中,我使用了POST来调用所有service请求。

从服务器获取特定代码(E.x:401)时,我调用API来获取新令牌。

直到收到另一个令牌,如果还有其他API调用,我会将所有这些请求存储在一个数组中。可能是 n 个请求。现在,假设正在进行3个API调用,而对newToken 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文件的功能。

注意:我仅在一个函数中获得订阅数据,而不是每个函数。换句话说,我在getProductData()函数中获得了两个API资源。我不知道为什么。

如果有任何解决方案,请帮助我。

4 个答案:

答案 0 :(得分:2)

您可以使用

forkJoin()

要同时处理多个呼叫,您可以在其中呼叫多个request,订阅后将获得array的响应。

例如

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

其中service1和service2是具有功能ccall1和call2且具有return类型Observable的service

您可以找到更多Here

答案 1 :(得分:1)

使用ForkJoin

  • 我们将使用一个名为forkJoin的运算符。如果你熟悉 对于Promises,这与Promise.all()非常相似。

  • forkJoin()运算符使我们可以获取Observables和
    的列表。 并行执行它们。

  • 列表中的每个Observable都发出一个值后,forkJoin将
    发出一个包含所有已解析列表的单个Observable值 列表中“观察值”中的值。

    在此示例中,我想加载一个角色和一个角色家庭世界。我们已经知道这些资源的ID是什么,因此我们可以并行请求它们。

    import { Component } from '@angular/core';
    import { HttpClient } from '@angular/common/http';
    import { Observable, forkJoin } from 'rxjs';
    
    @Component({
      selector: 'app-root',
      templateUrl: 'app/app.component.html'
    })
    export class AppComponent {
      loadedCharacter: {};
      constructor(private http: HttpClient) { }
    
      ngOnInit() {
        let character = this.http.get('https://swapi.co/api/people/1');
        let characterHomeworld = this.http.get('http://swapi.co/api/planets/1');
    
        forkJoin([character, characterHomeworld]).subscribe(results => {
          // results[0] is our character
          // results[1] is our character homeworld
          results[0].homeworld = results[1];
          this.loadedCharacter = results[0];
        });
      }
    }
    

在上面的示例中,我们捕获了变量中的character和characterHomeworld Observable。观测值是懒惰的,因此只有有人订阅时它们才会执行。当我们将它们传递给forkJoin时,forkJoin运算符将订阅并运行每个Observable,收集每个发出的值,最后发出包含所有已完成HTTP请求的单个数组值。这是JavaScript UI编程的典型模式。与使用传统回调相比,使用RxJS相对容易。

使用 mergeMap / flatMap forkJoin 运算符,我们仅需几行代码即可完成非常复杂的异步代码。

答案 2 :(得分:1)

简便方法

使用forkjoin()

void redirect(char *msg){
    int fd = fopen("hello.txt", 'wb');
    pid_t child = fork();
    if(child == 0){
        dup2(fd, STDOUT_FILENO);
        execve("/bin/echo", msg, environ);
    }
}

答案 3 :(得分:0)

使用zip中的rxjs lib

import { zip } from "rxjs";

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