因此,我试图连接到名为Pexels的外部服务器以获取一些照片。我正在从node.js做到这一点,但这只是一个JavaScript问题。遗憾的是,Pexels允许用户每页仅下载40张图片的对象。
https://api.pexels.com/v1/curated?per_page=40&page=1 // 40 is maximum
但是实际上我还需要更多。我想得到160个结果,即。合并所有前四页。为此,我尝试循环请求:
let pexelsData = [];
for(let i = 1; i < 5; i++) {
const randomPage = getRandomFromRange(1, 100); //pages should be randomized
const moreData = await axios.get(`https://api.pexels.com/v1/curated?per_page=40&page=${randomPage}`,
createHeaders('bearer ', keys.pexelsKey));
pexelsData = [ ...moreData.data.photos, ...pexelsData ];
}
现在我可以使用pexelsData,但它的工作非常不稳定,有时它能够获取所有组合数据,有时会崩溃。是否有正确且稳定的循环请求方式?
答案 0 :(得分:1)
您可以将其分解为类似的功能。
let images=[];
const getResponse = async i=> {
if(i<5)
return await axios.get(`https://api.pexels.com/v1/curated?per_page=40&page=${i}`)
}
const getImage = (i)=>{
if(i<5){
try {
const request = getResponse(i);
images = [...images,...request];
// here you will get all the images in an array
console.log(images)
getImage(++i)
} catch (error) {
console.log("catch error",error)
// getImage(i)
}
}
}
getImage(0); //call initail
答案 1 :(得分:1)
您使用具有速率限制的第三方API。因此,您应该在代码中添加速率限制。对您来说,最简单的解决方案是使用p-limit
或类似的方法promise-fun
它看起来像这样:
const pLimit = require('p-limit');
const limit = pLimit(1);
const input = [
limit(() => fetchSomething('foo')),
limit(() => fetchSomething('bar')),
limit(() => doSomething())
];
(async () => {
// Only one promise is run at once
const result = await Promise.all(input);
console.log(result);
})();