Javascript 变量在异步函数中被async.forEach循环覆盖
我偶然发现或制造了一个我无法在头脑中模拟的错误。我使用不同ID的WebDrivero客户端迭代调用URL,并解析生成的HTML。但是,html变量会被循环中的最后一个元素覆盖,这会导致数组包含最后一个html变量值的多个重复项: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
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实现吗?