【问题标题】:Async API Request to Return all Results异步 API 请求返回所有结果
【发布时间】:2018-12-21 15:17:11
【问题描述】:

我每次都尝试从 API 返回所有结果。相反,我的结果各不相同。 for 循环跳过请求并返回返回的随机记录数。有人可以帮忙吗?

我尝试过使用 async 和 await 功能。我也尝试实现 promise.all 但不认为我为 api 请求正确设置它。

// Get all ref codes and group by into an array.
  async getAllRefCodes() {
    const url = `${this.irRefCodes}`;
    const refCodes = [];
    let totalPage = 0;
    const params1 = new HttpParams().set('size', '20').set('page', `0`);
    await this.http.get(`${url}`, {params: params1 }).toPromise().then((data) => {
      console.log(data['page'].totalPages);
      console.log(data['page'].totalElements);
      totalPage = data['page'].totalPages;
    });
    for (let x = 0; x < totalPage; x++) {
     this.getRefCodesByPage(refCodes, url, x);
     console.log('Done');
    }
    await Promise.all(refCodes);
    console.log(refCodes);
  }

  // Getting all ref codes from API per page.
  async getRefCodesByPage(refCodes, url, pageNumber) {
    const params = new HttpParams().set('size', '20').set('page', `${pageNumber}`);
    const promise = new Promise ((resolve, reject) => {
      this.http.get(`${url}`, {params: params})
    .toPromise().then((refCodeData) => {
      const refCode = refCodeData['_embedded'].refCodes;
       refCodes.push(...refCode);
    });
      resolve();
      return promise;
    });
    await Promise.all(promise);
  }

希望每次都能获得所有记录。常数

【问题讨论】:

  • 有什么理由不使用 Observables 和订阅?
  • 好吧,我只想运行一次请求,然后在完成后将其终止。此外,API 一次只返回 20 个结果,所以我在 for 循环中运行它以一次获取所有页面,然后返回一个 JSON 对象。

标签: javascript angular ecmascript-6 es6-promise


【解决方案1】:
  1. 将结构从 promise 更改为 observables
  2. 移动for循环以在订阅块内逐页获取参考代码(这是我认为代码中的主要问题)

      getAllRefCodes() {
        const url = `${this.irRefCodes}`;
        const refCodes = [];
        let totalPage = 0;
        const params1 = new HttpParams().set('size', '20').set('page', `0`);
        this.http.get(`${url}`, {params: params1 }).subscribe((data) => {
          console.log(data['page'].totalPages);
          console.log(data['page'].totalElements);
          totalPage = data['page'].totalPages;
    
          for (let x = 0; x < totalPage; x++) {
            this.getRefCodesByPage(refCodes, url, x);
            console.log('Done');
           }
    
        });
    
        console.log(refCodes);}
    

    getRefCodesByPage(refCodes, url, pageNumber) { const params = new HttpParams().set('size', '20').set('page', ${pageNumber}); this.http.get(${url}, {params: params}).subscribe((refCodeData) => { 常量 refCode = refCodeData['_embedded'].refCodes; refCodes.push(...refCode); })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 2012-06-12
    • 2016-12-05
    • 2014-10-02
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多