如何避免 JavaScript 中的无限循环

我有一个 Selenium webdriverIOV5 框架。我在这里面临的问题是,下面的代码在 Mac OS 上工作正常,但在 Windows 操作系统上不能正常工作。在 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();


烙印99
浏览 424回答 1
1回答

梵蒂冈之花

由于您正在等待回调的结果,我建议Promise从您的getElements函数返回一个 new以及您resolve()在回调中收到的值。然后,当您调用 时getElements,您将需要解决该问题Promise或使用该await符号。该函数将在该点停止并等待Promise解决,但事件循环仍将继续。有关更多信息,请参阅一些文档。我将在下面编写一个示例,说明使用 aPromise时您的代码可能是什么样子,但是当您调用 时getElements,您需要将关键字放在await它之前。如果你想避免这种情况,你可以在你进入时解析PromisefromobjectCollector并从它的定义中getElements删除async关键字,但你真的不应该妨碍异步 JavaScript。此外,您可能可以稍微缩短代码,因为objectCollector在此示例中看起来像是一个不必要的函数:const glob = require('glob')const yamlMerge = require('yaml-merge')const sleep = require('system-sleep')let xpathclass 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();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript