我正在尝试以同步顺序运行异步测试。 也就是说,每个测试都需要加载文件,因此根据定义不同步 - 相反,我想等待每个测试加载其文件,运行代码,然后才进入下一个测试并加载其文件等。 / p>
问题 - 非常奇怪的是,我得到的闭包不能正确地保留局部变量的值。
这个片段是一个更大的库的一部分,所以我不能给出一个你可以运行的自给自足的例子,但是这里的逻辑非常简单。
let viewer = ...;
let tests = [...]; // Let's say the length is 3
function runTestSync(callback, index) {
console.log("FIRST", index)
if (index >= tests.length) {
callback(index, true);
} else {
let entry = tests[index];
// Results in files being loaded
entry[1](viewer);
// Add an event listener to the "viewer" object, which will eventually call the callback when all files finished loading
viewer.addEventListener("loadend", function listener() {
if (viewer.resourcesLoading === 0) {
console.log("SECOND", index);
viewer.removeEventListener(listener);
callback(index, false);
}
});
}
}
function myIter(index, done) {
if (!done) {
runTestSync(myIter, index + 1);
}
}
runTestSync(myIter, 0);
这是使用异步服务器提取的最简单的同步循环。 我想你们可以同意最终应该打印这些行:
FIRST 0
SECOND 0
FIRST 1
SECOND 1
FIRST 2
SECOND 2
反而会发生什么?
FIRST 0
SECOND 0
FIRST 1
SECOND 0
FIRST 1
SECOND 0
FIRST 1
...
我得到一个无限循环。
为什么对index
的第二次访问总是等于0?这显然打破了闭包应该起作用的方式。
答案 0 :(得分:0)
我忘了添加要在viewer.removeEventListener(TYPE, listener)
删除的侦听器类型。
那些是10个小时,我赢了回来。