进行多个快速API调用而不发送垃圾邮件的最有效方法?

时间:2018-09-09 04:20:22

标签: javascript node.js

通过进行此API调用,我将收到一个类似于以下内容的JSON文件:

{
    "objects": [
        {
            "a": 123456789,
            "b": 1
        },
        {
            "a": 272727272,
            "b": 1
        }
    ]
}

(这只是一个例子,我想尽可能简化它,但通常有20或30个对象)

我想对http://example.com/objects[0].a进行API调用,对http://example.com/objects[1].a进行API调用,然后将它们一起添加到“ responseA”中。

是否存在比循环处理多个对象更好的解决方案(因为这会花费很多时间,并且很容易在一秒钟内达到我的通话限制)。

有更好的解决方案吗?

Edit1:删除了无用的标签

2 个答案:

答案 0 :(得分:0)

一种方法是使用软件包axios。在这种情况下使用非常方便。

发出多个请求的示例:

const objectZeroURL = 'http://example.com/objects[0].a';
const objectOneURL = 'http://example.com/objects[1].a';

function getObjectZero() {
  return axios.get(objectZeroURL);
}

function getObjectOne() {
  return axios.get(objectOneURL);
}

app.get('/', (req, res) => {
  axios.all([getObjectZero(), getObjectOne()])
    .then(axios.spread((dataFromZero, dataFromOne) => {

      name = [];

      // Segregating data from the response object
      users.data.forEach((user) => {
        name.push(user.name);
      });

      // Segregating data from the response object
      posts.data.forEach((post) => {
        ...
      });

      // Writing back response to display
      for(var i = 0; i < name.length; i++) {
          res.write('=> ' + name[i]);
      }

      res.end();
    })).catch((error) => {
        res.status(500).render('error');
    });
});

我希望这能符合您所寻找的答案。

答案 1 :(得分:0)

看起来您需要将对象数组映射到Promises,这样每秒仅发送少量请求。这是一个代码示例,该示例使用delay帮助函数每秒仅发送3个请求,并使用Promise.all指示何时完成所有请求:

const objs={"objects":[{"a":123456789,"b":1},{"a":272727272,"b":1},{"a":123456789,"b":1},{"a":272727272,"b":1},{"a":123456789,"b":1},{"a":272727272,"b":1},{"a":123456789,"b":1},{"a":272727272,"b":1}]};

function makeRequest(a) {
  console.log('Making a request ' + a);
  return new Promise((res) => setTimeout(res, 200, 'response str'));
}
const delay = ms => new Promise(res => setTimeout(res, ms));
const requests = objs.objects.map((object, i) => (
  delay(1000 * Math.floor(i / 3))
  .then(() => makeRequest(object.a))
));
Promise.all(requests)
  .then((responses) => {
    console.log('done');
    console.log(responses);
  });