我试图从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。
答案 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);
}
}