如何等待按钮的侦听器在 javascript 中解析?

Posted

技术标签:

【中文标题】如何等待按钮的侦听器在 javascript 中解析?【英文标题】:How to await button's listeners to resolve in javascript? 【发布时间】:2022-01-22 20:55:48 【问题描述】:

我正在 Jest 中使用 jsdom 环境进行前端测试,这让我可以模拟 DOM 树并手动调用 button.click() 之类的东西。

我想要实现的是await button.click(),我认为应该等待所有按钮的听众解决他们的承诺,但不幸的是它不是那样工作的。

我们以这段代码为例:

class Test 
    constructor() 
        const button = document.getElementById('button');
        button.addEventListener('click', async () => this.fetch());
    

    async fetch(): Promise<void> 
        await this.sleep();
    

    sleep() 
        return new Promise(resolve => setTimeout(resolve, 2000))
    

现在假设我有一些异步 Jest 测试,我手动调用 button.click() 期望它等待 2000 毫秒:

async fun(): Promise<void> 
    const button = document.getElementById('button');
    
    await button.click(); //I expect this await to sleep for 2000ms but it resolves instantly

【问题讨论】:

【参考方案1】:

我认为这里的问题是您必须在此处添加等待:

  constructor() 
        const button = document.getElementById('button');
        button.addEventListener('click', async () => await this.fetch());
    

【讨论】:

不幸的是,这也失败了。 VSCode 告诉我这个 await 是多余的,我可以删除它。【参考方案2】:

据我所知,环境不会等待您的事件侦听器完成。火了就忘了。

相反,让我们退后一步。测试是关于什么的?你想测试前端的某个变化吗?例如:如果有某种加载指示器,您可以测试 DOM 中是否存在加载指示器,而不是测试类/代码的内部工作。

使用 jest、reactjs 和 @testing-library/react 的示例可能如下所示。

// render the DOM
const  getByRole, getByText  = render(
    <App />
)

const button = getByRole("button",  name: "Submit" )

// click the button
button.click()

// wait till the text appears within the DOM
await waitFor(() => 
    getByText("Successfully submitted!")
)

waitFor 是这里的关键函数。如果提供的回调成功,它会间隔检查。只有当 waitFor 完成时,测试才会继续。

请不要说这个例子使用了 reactjs,但是这篇文章的核心是关于在 DOM 中等待信号的想法,而不是关于某个库。

但是我可能在这里走错了路,如果是这样,请随时提供更多信息。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于如何等待按钮的侦听器在 javascript 中解析?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中压缩 JSON 并在 Javascript 中解压缩 [关闭]

在 Javascript 中解压缩 bzip2 数据

PHP 在WordPress后期编辑器中解锁更多有用的按钮

在WordPress后期编辑器中解锁更多有用的按钮

javascript 按下按钮的Flic按钮监听器。

javascript 重写Flic的按钮按下侦听器以减少按下之间的超时