递归调用异步 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;
}
我正在尝试从每次调用仅 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;
}