如何避免 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 函数返回一个新的 Promiseresolve() 您在回调中收到的值。然后,当您调用 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();