Javascript 变量在异步函数中被async.forEach循环覆盖

Javascript 变量在异步函数中被async.forEach循环覆盖,javascript,html,node.js,asynchronous,webdriver-io,Javascript,Html,Node.js,Asynchronous,Webdriver Io,我偶然发现或制造了一个我无法在头脑中模拟的错误。我使用不同ID的WebDrivero客户端迭代调用URL,并解析生成的HTML。但是,html变量会被循环中的最后一个元素覆盖,这会导致数组包含最后一个html变量值的多个重复项: async.forEach(test, function (id, callback) { self.url('https://<api-page>?id=' + id).getHTML('table tbody', true).then(functio

我偶然发现或制造了一个我无法在头脑中模拟的错误。我使用不同ID的WebDrivero客户端迭代调用URL,并解析生成的HTML。但是,html变量会被循环中的最后一个元素覆盖,这会导致数组包含最后一个html变量值的多个重复项:

async.forEach(test, function (id, callback) {
  self.url('https://<api-page>?id=' + id).getHTML('table tbody', true).then(function(html) {
          //Parse HTML
          parser.write(html);
          parser.end();

          //Add course to person, proceed to next.
          callback();
  });
}, function (err) {
  self.end().finally();
  res.json(person);
});
解析是使用htmlparser2npm库完成的。html变量总是返回最后一个元素,即使我可以看到它使用不同的数据通过不同的API ID。我认为错误在于我获取HTML并返回它时,但我无法说明原因,也无法说明我的任何修复是否有效

希望比我更熟练的人能看到错误

提前感谢,, 克里斯


更新/解决方案-请参阅下面的解决方案我不确定是否完全理解上下文,但html变量没有被覆盖,它只是您从self.url函数调用中检索到的最后一个块。如果希望将整个结果保存在一个变量中,则应在每个循环中添加结果。也许你需要这样的东西:

var html = '';

async.forEach(test, function (id, callback) {
  self.url('https://<api-page>?id=' + id).getHTML('table tbody', true).then(function (tmpHtml) {
    //Parse HTML
    parser.write(tmpHtml);
    parser.end();

    html += tmpHtml;
    //Add course to person, proceed to next.
    callback();
  });
}, function (err) {
  self.end().finally();
  res.json(person);
});

我最终找到了答案,我错过了async.forEach并行执行函数,而我需要的函数是async.TimeSeries,它在循环中执行函数,等待每个函数完成后再启动下一个函数!我已将工作代码附在下面:

async.timesSeries(3, function(n, next) {
  self.url('<api-page>?id=' + n').then(function() {
    console.log("URL Opened");
  }).getHTML('table tbody', true).then(function(html) {
    console.log("getHTML");
    parser.write(html);
    parser.end();
    next();
  });
}, function(err, results) {
  //Add to person object!
  self.end().finally();
  res.json(person);
});

听起来你好像遇到了一个关于ypur回复Svabael的问题。是否可以为每个getURL->getHTML调用处理html?我需要更多的上下文来回答这个问题。你想达到什么目标?解析器正在做什么?在我看来,移动parser.end似乎是合理的;在最后一次回调时,就在self.end.finally之前;并删除附加html+=tmpHtml;的行;。我正在使用selenium解析一系列网页,在循环中使用不同的ID调用url,加载每个网页后,我提取HTML并解析该网页上的一个表。在html解析器中,我将表行等保存到一个JSON对象中,然而,由于进入解析的html是相同的,我只是为每个页面获取相同的JSON对象,或者它会覆盖?快速更新:我刚刚尝试将html附加到一个变量中,由于某些原因,我仍然会两次获取最后一个元素,而不是两个单独的HTML元素如果在self.url中放置console.logtmpHtml,您是否得到了预期的结果?你能发布self.url实现吗?