如何避免 JavaScript 中的无限循环
How to avoid an infinite loop in JavaScript
我有一个 Selenium webdriverIO
V5 框架。我在这里面临的问题是,下面的代码在 Mac OS 上运行良好,但在 Windows OS 上无法正常运行。在 Windows OS 中,它陷入了无限循环问题。
下面的代码功能是:合并 yaml
文件(包含定位器)和 return 通过传递键定位器的值:
const glob = require('glob');
const yamlMerge = require('yaml-merge');
const sleep = require('system-sleep');
let xpath;
class Page {
getElements(elementId) {
function objectCollector() {
glob('tests/wdio/locators/*.yml', function (er, files) {
if (er) throw er;
xpath = yamlMerge.mergeFiles(files);
});
do {
sleep(10);
} while (xpath === undefined);
return xpath;
}
objectCollector();
return xpath[elementId];
}
}
module.exports = new Page();
由于您正在等待回调的结果,我建议从您的 getElements
函数返回一个新的 Promise
并 resolve()
您在回调中收到的值。然后,当您调用 getElements
时,您将需要解析 Promise
或使用 await
表示法。该函数将在该点停止并等待 Promise
解决,但事件循环仍将继续。查看一些 documentation 了解更多信息。
我将在下面写一个示例,说明您的代码使用 Promise
时的样子,但是当您调用 getElements
时,您需要在前面加上关键字 await
它。如果你想避免这种情况,你可以在 getElements
中从 objectCollector
解析 Promise
并从其定义中删除 async
关键字,但你真的不应该妨碍异步 JavaScript。此外,您可能可以稍微缩短代码,因为 objectCollector
在本例中看起来像是一个不必要的函数:
const glob = require('glob')
const yamlMerge = require('yaml-merge')
const sleep = require('system-sleep')
let xpath
class Page {
function async getElements(elementId) {
function objectCollector() {
return new Promise((resolve,reject) => {
glob('tests/wdio/locators/*.yml', function (er, files) {
if (er) reject(er)
resolve(yamlMerge.mergeFiles(files))
})
})
}
let xpath = await objectCollector()
return xpath[elementId]
}
}
module.exports = new Page();
我有一个 Selenium webdriverIO
V5 框架。我在这里面临的问题是,下面的代码在 Mac OS 上运行良好,但在 Windows OS 上无法正常运行。在 Windows OS 中,它陷入了无限循环问题。
下面的代码功能是:合并 yaml
文件(包含定位器)和 return 通过传递键定位器的值:
const glob = require('glob');
const yamlMerge = require('yaml-merge');
const sleep = require('system-sleep');
let xpath;
class Page {
getElements(elementId) {
function objectCollector() {
glob('tests/wdio/locators/*.yml', function (er, files) {
if (er) throw er;
xpath = yamlMerge.mergeFiles(files);
});
do {
sleep(10);
} while (xpath === undefined);
return xpath;
}
objectCollector();
return xpath[elementId];
}
}
module.exports = new Page();
由于您正在等待回调的结果,我建议从您的 getElements
函数返回一个新的 Promise
并 resolve()
您在回调中收到的值。然后,当您调用 getElements
时,您将需要解析 Promise
或使用 await
表示法。该函数将在该点停止并等待 Promise
解决,但事件循环仍将继续。查看一些 documentation 了解更多信息。
我将在下面写一个示例,说明您的代码使用 Promise
时的样子,但是当您调用 getElements
时,您需要在前面加上关键字 await
它。如果你想避免这种情况,你可以在 getElements
中从 objectCollector
解析 Promise
并从其定义中删除 async
关键字,但你真的不应该妨碍异步 JavaScript。此外,您可能可以稍微缩短代码,因为 objectCollector
在本例中看起来像是一个不必要的函数:
const glob = require('glob')
const yamlMerge = require('yaml-merge')
const sleep = require('system-sleep')
let xpath
class Page {
function async getElements(elementId) {
function objectCollector() {
return new Promise((resolve,reject) => {
glob('tests/wdio/locators/*.yml', function (er, files) {
if (er) reject(er)
resolve(yamlMerge.mergeFiles(files))
})
})
}
let xpath = await objectCollector()
return xpath[elementId]
}
}
module.exports = new Page();