递归调用异步 API 调用

Recursively calling an asynchronous API call

我正在尝试从每次调用仅 returns 1000 项的 API 中获取数据,我想递归执行此操作,直到获得所有数据。

我事先不知道总共有多少物品,所以每次打电话后我都要检查

如果调用是同步的,我会使用这样的东西:

function fetch(all, start) {
    const newData = getData(start, 1000);
    all = all.concat(newData);
    return (newData.length === 1000) ? fetch(all, all.length) : all;
}

但是,这里的getData()调用是异步的。使用 Promise.all() 不起作用,因为我事先不知道我需要多少次调用,所以我无法准备一系列调用。

我觉得我可以用生成器或 async/await 解决这个问题,但我不知道如何解决。谁能指出我正确的方向?

以防万一,我正在使用 Angular 4.

你可以用 async/await 实现这个而不用递归:

let fetch = async () {
  try {
    let start = 0;
    let all = [];
    let newData;
    do {
      newData = await getData(start, 1000);
      start += newData.length;
      all = all.concat(newData);
    } while (newData.length > 0);

    return all;
  } catch (err) {
    console.log(err);
  }
}

这取决于您的情况是如何处理的。考虑到 getData returns 一个承诺,它是:

async function fetch(all, start) {
    const newData = await getData(start, 1000);
    all = all.concat(newData);
    return (newData.length === 1000) ? await fetch(all, all.length) : all;
}