【问题标题】:Make http request over array every minute每分钟通过数组发出 http 请求
【发布时间】:2019-07-11 03:08:55
【问题描述】:

我必须延迟检索超过 1000 个 IP 地址。由于我必须使用 ip-api.com /batch,因此该 api 的 post 方法每分钟最多需要 100 个 Json 参数长度。我输入了超过 1000 个 ip 地址的数组,并创建了一个新数组,每个索引都有另一个长度最大为 100 的数组。现在我正在努力对数组上的每个索引进行 http 调用,并等待一分钟,等待下一个新请求指数。

  //for example I have two index in groups and each index has other 3 
    indexes 
   let groups= [[ { query: '193.206.170.145', fields: 'lat,lon' },
      { query: '37.186.207.50', fields: 'lat,lon' },
     { query: '193.206.170.144', fields: 'lat,lon' },
      { query: '62.18.244.163', fields: 'lat,lon' }],
      [ { query: '79.52.35.144', fields: 'lat,lon' },
         { query: '62.18.249.56', fields: 'lat,lon' },
       { query: '176.200.132.147', fields: 'lat,lon' }]]


groups.forEach( el => makeRequest(el));


function makeRequest (array){
let toJson = JSON.stringify(array)
  setInterval(function(){
  axios.post('http://ip-api.com/batch',toJson)
    .then(function (response) {
    console.log(response.data);
 })
   .catch(function (error) {
    console.log(error);
     });

  },60000);
}

 Expected:

  [{ lat: 45.8, lon: 8.8333 },
   { lat: 45.8155, lon: 8.82753 },
   { lat: 45.8, lon: 8.8333 }]

 after one minute   
   [{ lat: 41.818, lon: 12.4148 },
   { lat: 45.4643, lon: 9.1895 },
   { lat: 45.5324, lon: 9.0402 }]

【问题讨论】:

    标签: node.js api asynchronous


    【解决方案1】:
    const axios = require('axios');
    
    let groups = [[{ query: '193.206.170.145', fields: 'lat,lon' },
    { query: '37.186.207.50', fields: 'lat,lon' },
    { query: '193.206.170.144', fields: 'lat,lon' },
    { query: '62.18.244.163', fields: 'lat,lon' }],
    [{ query: '79.52.35.144', fields: 'lat,lon' },
    { query: '62.18.249.56', fields: 'lat,lon' },
    { query: '176.200.132.147', fields: 'lat,lon' }]]
    
    groups.forEach(el => makeRequest(el));
    
    function makeRequest(array) {
        for (var i = 0; i < array.length; i++) {
            (function (i) {
                let toJson = JSON.stringify(array)
                setTimeout(function () {
                    axios.post('http://ip-api.com/batch', toJson)
                        .then(function (response) {
                            console.log(response.data);
                        })
                        .catch(function (error) {
                            console.log(error);
                        })
                }, 60000 * i);
            })(i);
        }
    }
    

    【讨论】:

    • 这一分钟后发出所有的http请求。我想,将请求一个作为第一个索引,在响应之后,等待一分钟,然后通过第二个索引发出 http 请求
    • 不,它没有。如果您仔细观察,您会发现超时是循环计数器值的函数。所以每一个连续的请求与前一个请求相距60000ms。
    • 它不起作用。 http 请求是对组的每个元素的发布。您为每个组索引中的每个元素发出 http 请求
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多