递归调用异步API调用

时间:2017-08-22 09:31:57

标签: javascript angular recursion promise ecmascript-2017

我试图从API中获取数据,每次调用只返回1000个项目,我想以递归方式执行此操作,直到获得所有数据。

我事先并不知道总共有多少项目,所以在每次通话后我都要检查

如果通话是同步的,我会使用以下内容:

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。

2 个答案:

答案 0 :(得分:5)

这取决于您的情况如何完成。考虑到getData返回一个承诺,它是:

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;
}

答案 1 :(得分:3)

您可以使用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);
  }
}