Search code examples
arraysangulartypescriptgethttprequest

Get request using loop


There was such a problem.

I'm trying to make a certain number of GET requests in Wikipedia API using a cycle. Trying to do this with the function getAllInfo()

articles.components.ts

export class ArticlesComponent {
  constructor(private articlesServices: ArticlesService) { }

  @Input() allTitles: string[];

  articlesInfo: ArticleInformationNew;
  allArray: [[string, number]] = [['', 0]];

  static getUrlInformation(searchQuery: string) {
    return 'https://ru.wikipedia.org/w/api.php?action=query&titles='
      + searchQuery + '&prop=info&format=json&origin=*';
  }

  getAllInfo() {
    for (const title of this.allTitles) {
      this.articlesServices.getArticleInformation(ArticlesComponent.getUrlInformation(title))
        .subscribe(
          (data: ArticleInformation) => this.articlesInfo = {
            ...data,
            query: { pages: [Object.values(data.query.pages)[0]]}}
        );
        this.allArray.push([this.articlesInfo.query.pages[0].touched, this.articlesInfo.query.pages[0].length]);
    }
  }
}

articles.service.ts

export interface ArticleInformation {
  batchComplete: string;
  query: {
    pages: {
    }
  };
}

export interface ArticleInformationNew {
  batchComplete: string;
  query: {
    pages: any[]
  };
}

export class ArticlesService {
  constructor(private http: HttpClient) { }

  getArticleInformation(url) {
    return this.http.get<ArticleInformation>(url);
  }
}

An array this.allTitles can consist of a number of lines. For example: this.allTitles = ['Naumen', 'Naumen DMS']

I expect that the arraythis.allArray will be two-dimensional and contain arrays that consist of rows with data for each query. For example:

this.allArray[0] = ['', 0]
this.allArray[1] = ['2019-02-01T23:27:26Z', 3687]
this.allArray[2] = ['2019-01-21T04:24:21Z', 9704]

But in fact, it turns out that each element of a two-dimensional array is the same. For example:

this.allArray[0] = ['', 0]
this.allArray[1] = ['2019-02-01T23:27:26Z', 3687]
this.allArray[2] = ['2019-02-01T23:27:26Z', 3687]

Why and how to fix it?


Solution

  • Try this,

    getAllInfo() {
        for (const title of this.allTitles) {
          this.articlesServices.getArticleInformation(ArticlesComponent.getUrlInformation(title))
            .subscribe(
              (data: ArticleInformation) => {
                this.articlesInfo = {
                    ...data,
                    query: { pages: [Object.values(data.query.pages)[0]]}
                }
                this.allArray.push([this.articlesInfo.query.pages[0].touched,this.articlesInfo.query.pages[0].length]);
              } 
            );
    
        }
      }