【问题标题】:How to avoid an infinite loop in JavaScript如何避免 JavaScript 中的无限循环
【发布时间】:2019-11-11 13:24:08
【问题描述】:

我有一个 Selenium webdriverIO V5 框架。我在这里面临的问题是,以下代码在 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();

【问题讨论】:

  • 如果你不想使用异步东西的好处,尤其是与 io 相关的东西,为什么还要使用 nodejs。只是不要使用睡眠或其他阻塞调用。
  • 框架是nodeJS。那么您是否建议在“做”部分中删除睡眠?
  • 是的。避免你的 dowhile 循环,并通过从 getElements 返回一个 Promise 或向它传递一个回调来熟悉异步范例

标签: javascript selenium-webdriver webdriver-io


【解决方案1】:

由于您正在等待回调的结果,我建议您从您的 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();

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2010-11-15
    相关资源
    最近更新 更多