Javascript 需要解释这种特殊的奇怪的异步行为吗

Javascript 需要解释这种特殊的奇怪的异步行为吗,javascript,node.js,asynchronous,node.js-tape,Javascript,Node.js,Asynchronous,Node.js Tape,我对javascript库进行了e2e测试,该库使用canvas元素。它是这样组织的:有一个包含链接列表、画布和图像元素的html页面。当我点击一个链接时,库会在画布上绘制一个特定的测试用例,并加载一个带有预期视图的图像。我还有一个node.js脚本,可以通过webdriverio、EJS(用于比较图像的库)和tape(测试框架)自动执行这些操作 现在,这个奇怪的部分(下面的例子工作正常,测试失败,如果图像与画布不同,等等),我获取所有链接,将图像和画布与SimpleEJS进行比较,并存储数据(

我对javascript库进行了e2e测试,该库使用canvas元素。它是这样组织的:有一个包含链接列表、画布和图像元素的html页面。当我点击一个链接时,库会在画布上绘制一个特定的测试用例,并加载一个带有预期视图的图像。我还有一个node.js脚本,可以通过webdriverio、EJS(用于比较图像的库)和tape(测试框架)自动执行这些操作

现在,这个奇怪的部分(下面的例子工作正常,测试失败,如果图像与画布不同,等等),我获取所有链接,将图像和画布与SimpleEJS进行比较,并存储数据(这是SimpleEJS比较的结果,在数组中),然后我运行另一个循环,在其中我调用tape和test stuff:

const links = await browser.$$('#ul li a');
const testsData = [];
for (const link of links) {
  const data = await compare(link);
  const testName = await link.getText();
  testsData.push([testName, data]);
}

for (const [testName, data] of testsData) {
  tape(testName, t => {
    t.equal(data.rawMisMatchPercentage < 1, true);
    t.end();
  });
}
await browser.deleteSession();
const links=wait browser.$$('ul li a');
常数testsData=[];
for(链接的常量链接){
常量数据=等待比较(链接);
const testName=wait link.getText();
push([testName,data]);
}
for(testsData的常量[testName,data]{
磁带(testName,t=>{
t、 相等(data.rawmatchpercentage<1,真);
t、 end();
});
}
等待browser.deleteSession();
但是如果我尝试使用一个循环,比如这里:

const links = await browser.$$('#ul li a');
let counter = 1;
for (const link of links) {
  console.log('LOOP START ' + counter);
  const data = await compare(link);
  const testName = await link.getText();
  tape(testName, t => {
    console.log('TEST START ' + counter);
    t.equal(data.rawMisMatchPercentage < 1, true);
    t.end();
    console.log('TEST END ' + counter);
  });
  console.log('LOOP END ' + counter++);
}

await browser.deleteSession();
const links=wait browser.$$('ul li a');
设计数器=1;
for(链接的常量链接){
console.log('循环启动'+计数器);
常量数据=等待比较(链接);
const testName=wait link.getText();
磁带(testName,t=>{
console.log('测试启动'+计数器);
t、 相等(data.rawmatchpercentage<1,真);
t、 end();
console.log('测试结束'+计数器);
});
log('LOOP END'+计数器++);
}
等待browser.deleteSession();
脚本的执行方式如下:

  • 循环开始1//页面上的操作开始,然后进行比较并返回结果
  • 循环结束1//调用磁带,将回调放在某个位置并返回
  • 循环开始2//页面上的操作已启动(请求已发送到webriver),这为node.js脚本创建了空闲时间,因此磁带的第一次调用的回调有机会运行
  • 测试开始1
  • 测试结束1
  • 环端2
  • 循环开始3//由于某些原因,页面上的操作不再允许运行以前的测试,就像在循环开始2上一样
  • 环端3
  • 循环开始4
  • 环端4
  • 等等
除测试1外,所有测试均失败,并显示以下消息:
not ok test\u NUM test未结束退出
。显然,node.js脚本退出时从未运行过磁带回调(第一次除外)

我明白,磁带不会立即运行测试,它会接受回调,稍后再运行,但让我困惑的是:当仍有回调要运行时,脚本怎么会退出?

任何暗示都将不胜感激



目前,我怀疑这是磁带库的一个bug或其他问题。这就是正在发生的事情(我能够研究的):磁带接受回调,运行第一个回调,报告结果,但不运行其余的回调,但即使没有尝试调用它们,也会将它们报告为“失败”。

是的,这听起来像磁带中的错误。另一方面,在第一次测试开始后,磁带似乎不希望再调用
磁带(…)
,这意味着您需要同步运行所有
磁带(…)
调用。在
async
/
await
循环中,您不会这样做。是的,这听起来像是磁带中的错误。另一方面,在第一次测试开始后,磁带似乎不希望再调用
磁带(…)
,这意味着您需要同步运行所有
磁带(…)
调用。在
async
/
await
循环中,您不会这样做。