为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免 JavaScript 中的无限循环

如何避免 JavaScript 中的无限循环

烙印99 2021-12-23 16:47:47
我有一个 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();
查看完整描述

1 回答

?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

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


查看完整回答
反对 回复 2021-12-23
  • 1 回答
  • 0 关注
  • 422 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号