我正在编写一个脚本,该脚本将从API检索数据。我需要获取API中数据的所有实例,但API一次只能将我限制为250个结果。响应还为我提供了一个偏移号,我可以在新的API调用中使用该偏移号来获取下一组结果。我知道我需要进行多少次API调用,我的想法是在params中使用变量,以便在每次调用API之后可以更新偏移量。问题总是落在实际设置变量上,并在循环再次运行时使用它。
我能够运行ajax请求并返回数据,然后将偏移量设置为变量。我尝试创建一个初始API调用,然后返回响应,然后在for循环内的新函数中使用该返回值。看来这是最接近我的解决方案,但是每次循环运行时,变量都会重置为null,然后我又得到了初始偏移值。
这是最新的代码:
for (iteration = 1; iteration < 4; iteration++) {
let offsetValue;
pullWriteData = offsetValue => {
return axios({
method: "get",
url: "https://api.hubapi.com/engagements/v1/engagements/paged",
params: {
hapikey: "API_KEY_HERE",
limit: 250,
offset: offsetValue
}
}).then(response => {
return response.data;
});
};
pullWriteData().then(data => {
offsetValue = data.offset;
console.log("New offset value: " + offsetValue);
return offsetValue;
});
}
此代码返回:
New offset value: 12345678
New offset value: 12345678
New offset value: 12345678
我还在我的pullWriteData()调用的.then
中建立了第二个Axios调用,该调用是有效的,但肯定会破坏编写程序来为我执行此操作的目的。
我期望这将运行初始API调用,将数据写入文件,更新offsetValue
,使用新的offsetValue
再次运行API调用,并将响应写入文件,更新offsetValue
并重复执行,直到提取所有数据为止。
就将数据写入文件而言,我已经可以使用fs
来做到这一点。只是让offsetValue
值更新似乎让我感到困扰。
谢谢您的指导。
答案 0 :(得分:1)
我认为您可以根据需要调整此示例:
(async () => {
const times = Array.from({ length: 4 }, (_, i) => i));
let offset;
for (let i of times) {
offset = await pullWriteData(offset);
}
})();
function pullWriteData(offsetValue) {
return axios({
method: 'get',
url: 'https://api.hubapi.com/engagements/v1/engagements/paged',
params: {
hapikey: 'API_KEY_HERE',
limit: 250,
offset: offsetValue
}
}).then(response => response.data);
}
答案 1 :(得分:1)
使用async/await
,可以对promises
进行以下操作,以确保每次获取下一个offset
并将其设置在循环中,以便下一个链接的{{1} }请求将新的async
传递给该请求。
注意:在您当前的迭代中,您只会发出3个请求,从offset
请求中没有offset=
开始,然后接下来的2个请求将使用分别从第一个和第二个请求返回的GET
值,并且不使用第三个返回的offset
值,因为没有发出另一个请求。
offset
const getEngagements = (offsetValue) => {
return new Promise((resolve, reject) => {
axios({
method: "get",
url: "https://api.hubapi.com/engagements/v1/engagements/paged",
params: {
hapikey: "demo",
limit: 250,
offset: offsetValue
}
}).then(response => {
return resolve(response.data);
}).catch(error => {
return reject(error.message)
})
})
}
const startPaging = async() => {
let offsetValue;
for (let num of [1, 2, 3]) {
await getEngagements(offsetValue).then((data) => {
offsetValue = data.offset;
console.log("New offset value: " + offsetValue);
})
}
/* You could also do a while() loop for while
* dataHasMore = true from response data, if you
* weren't doing a fixed iteration..
*/
/*
let dataHasMore = true;
while (dataHasMore) {
await getEngagements(offsetValue).then((data) => {
dataHasMore = data.hasMore;
offsetValue = data.offset;
console.log("New offset value: " + offsetValue);
})
}
*/
console.log('Done');
}
startPaging();