【问题标题】:Using a closure in a do while loop for a get request在 do while 循环中为 get 请求使用闭包
【发布时间】:2019-01-11 10:18:30
【问题描述】:

我有 5 个端点需要从中获取信息。我一次只能抓取 500 个对象。我的思考过程是我需要遍历每个端点并将返回的结果推送到我的对象。然后,我将请求嵌套在 do while 循环中,以确保循环持续到整个 obj。例如,如果我有 50,000 个候选者,do while 循环将执行 100 次并将每个结果推送到 obj,然后在完成后将其推送到 parentObj。由于异步性质,我遇到了循环在返回 get 请求之前完成的问题。由于顺序无关紧要,我如何确保请求在循环增加之前成功返回?我正在阅读 David 的 Article 并且闭包适用于 for 循环,但不适用于 do while。在这种情况下,关闭将如何工作?如果我的逻辑不正确,请纠正我。

var dataArr = ['/v1/candidates?per_page=500&page=1','/v1/eeoc?per_page=500&page=1','/v1/jobs?per_page=500&page=1','/v1/job_stages?per_page=500&page=1','/v1/applications/?per_page=500&page=1'];
var parentObj = {};

for ( var i = 0; i < dataArr.length; i++ ) {

    var options = {
      hostname: 'myURL',
      port: 443,
      path: dataArr[i],
      method: 'GET',
      headers: {
         'Authorization' : 'Basic MYKEY',
      }
    };

    var obj = {};
    do {
       https.get(options, (res) => {
          res.on('data', (d) => {
             var result = d.toString('utf8');
             // push returned result object to obj 
          });
       }).on('error', (e) => {
         console.error(e);
       });
     } while (obj.length % 500 === 0 && obj.length ==! 0); 
     // push obj to parentObj here
    } 
};
callback(null, parentObj);

【问题讨论】:

  • ` 我正在阅读 David 的文章,并且闭包适用于 for 循环,但不适用于 do while。 ` 闭包在任何地方都有效,但在这里它们不是问题。

标签: javascript for-loop closures do-while get-request


【解决方案1】:

问题不是闭包,问题是请求的回调将在循环完成后发生,而它永远不会发生。所以你必须在继续循环之前等待请求:

 (async function() {
   for ( var i = 0; i < dataArr.length; i++ ) {

      var options = {
        hostname: 'myURL',
        port: 443,
        path: dataArr[i],
        method: 'GET',
        headers: {  'Authorization' : 'Basic MYKEY'   }
      };

      var obj = {};
      do {
        try {
         const request = await new Promise(resolve => https.get(options, resolve));
         const result = await new Promise((resolve, reject) => {
            request.on("data", d => resolve(d.toString("utf8")));
            request.on("error", reject);
         });
        } catch(e) { /* handle request errors */ }
       } while (obj.length % 500 === 0 && obj.length ==! 0); 
       // push obj to parentObj here
      } 
      callback(null, parentObj);
  }
})();

https 库可能会提供一些帮助来处理 Promise,但由于我不知道它们,所以我手动创建了它们

【讨论】:

  • 谢谢。这帮助很大!
猜你喜欢
  • 2021-07-18
  • 2016-03-27
  • 2012-07-01
  • 2015-02-16
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多