如何避免JavaScript中的无限循环

时间:2019-11-11 13:24:08

标签: javascript selenium-webdriver webdriver-io

我有一个Selenium webdriverIO V5框架。我在这里面临的问题是,以下代码在Mac OS上可以正常运行,但在Windows OS上不能正常运行。在Windows操作系统中,它陷入了无限循环问题。

以下代码功能是:合并yaml个文件(包含定位符),并通过传递键来返回定位符的值:

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();

1 个答案:

答案 0 :(得分:0)

由于您正在等待回调的结果,因此建议您从Promise函数返回一个新的getElementsresolve()返回的值。然后,当您调用getElements时,您将需要解析该Promise或使用await表示法。该函数将在此时停止并等待Promise解析,但是事件循环仍将继续。有关更多信息,请参见一些documentation

下面我将写一个示例,说明使用Promise时代码的外观,但是调用getElements时,需要在关键字await之前加上关键字。如果要避免这种情况,可以在进入Promise时从objectCollector解析getElements并从其定义中删除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();