【问题标题】:Loop GET requests with incremental parameters使用增量参数循环 GET 请求
【发布时间】:2017-04-14 10:19:13
【问题描述】:

我正在尝试从很多页面(相同的页面,但不同的数据)获取数据。我认为问题在于 Node 的异步请求方法和“for”循环。 (我是 nodejs 的新手)。

我使用 for 循环使用请求获取 JSON 数据,但循环在我得到请求的第一个响应之前完成(我认为)。

这是我每天使用 JSON 的代码:

var str = [];
    for (var i = 0; i < 2000; i++) {

        var url = 'https://WEbPAGE.com/public?start='+prevDate+'&end='+nextDate;

        request(url, (error, response, body)=> {
          if (!error && response.statusCode === 200) {

            str.push(body+'\r\n')

          }
        })

        prevDate = nextDate;
        nextDate += oneDay; 

        if (nextDate >= today) break;   
    };

完成后,我从请求中获取所有数据,但未排序,并且数组的很多位置都是空的。

【问题讨论】:

标签: javascript node.js


【解决方案1】:

使用带有回调的函数而不是 for 循环,只要日期不匹配,就继续运行相同的函数,然后一旦 date = today,回调。

function addData(prevdate,nextDate,cb){
    var url = 'https://WEbPAGE.com/public?start='+prevDate+'&end='+nextDate;
    request(url, (error, response, body)=> {
        if (!error && response.statusCode === 200) {
            str = str.concat(body+'\r\n')
            prevDate = nextDate;
            nextDate += oneDay; 
            if (nextDate >= today){
                cb()
            }else{
                addData(prevdate,nextDate,cb)
            }
        }
    })
}

addData(firstPrevDate,firstNextDate,function(){
     // str is ready!
});

编辑: 正如 cmets 中所指出的,此示例中的请求将按顺序执行。您可以修改方法以一次运行几个,但您可能不应该尝试运行 2000 个并行请求,否则您将度过一段糟糕的时光!

【讨论】:

  • 请求将串行执行,而不是并行执行
  • 启动 2000 个并行请求不是一个好主意,是吗?
猜你喜欢
  • 2020-02-17
  • 2018-02-12
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 2021-07-27
相关资源
最近更新 更多