循环获取数据

时间:2018-09-27 11:18:12

标签: javascript node.js reactjs

因此,我试图连接到名为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,但它的工作非常不稳定,有时它能够获取所有组合数据,有时会崩溃。是否有正确且稳定的循环请求方式?

2 个答案:

答案 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);
})();