变量在异步函数中被async覆盖.forEach循环
Variable is overwritten in asynchronous function with async.forEach loop
我偶然发现(或者当然是我自己创造的)一个错误,我不能在我的头脑中建模。我使用webdriverio客户端使用不同的id和解析结果的HTML迭代调用URL。但是,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);
});
解析是使用htmlparser2 NPM库完成的。html变量总是返回最后一个元素,尽管我可以看到它使用不同的API id和不同的数据。我认为错误在于当我得到HTML并返回它,但我不能说为什么,也没有任何我的修复工作。
希望有比我更熟练的人能发现这个错误。
提前感谢,克里斯。
更新/解决方案-参见下面的解决方案
我不确定我是否很好地理解了上下文,但html变量没有被覆盖,它只是你从自我检索的最后一块。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并行执行函数,而我需要的函数是异步的。timesSeries,它在循环中执行函数,等待每个函数完成后再开始下一个!我在下面附上了工作代码:
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);
});
相关文章:
- 在循环中分配json值时,值被覆盖
- 谷歌地图固定位置覆盖
- 只覆盖箭头键滚动事件
- JQuery覆盖不更改单选选项
- 如何覆盖锚点元素's href目标,并在我点击转到目标javascript时删除其他错误
- 将添加一个相同类型的事件附加或覆盖以前添加的具有相同名称的事件
- 传单中如何在更改基层时启用/禁用覆盖层
- 点击(右键点击)使用传单地图库获取图像覆盖的像素坐标
- HTML/CSS-用于拖放的全页面覆盖
- 让javascript知道epub3电子书中何时播放媒体覆盖
- jQuery加载的async和ready函数不工作
- 覆盖函数中的函数
- 无法覆盖CSS伪元素:before
- 什么'这是从第三个函数上的async 1st函数获得结果的更好方法
- 如何覆盖原型中的事件侦听器
- 超过了async.detect最大调用堆栈大小
- 覆盖在赢得'不允许点击下面的标记,谷歌地图api v3
- 如何覆盖主干中的extend方法
- js/jquery Async内容覆盖页面
- 变量在异步函数中被async覆盖.forEach循环