You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让JavaScript类等待指定按键按下后再继续执行?

类中实现等待正确按键后继续执行的问题修复

你的类代码问题出在错误按键时的递归逻辑:当按下非"z"键时,你移除了当前的键盘监听器,然后调用this.waitForKeyPress()创建了一个新的Promise和监听器,但最初的waitForKeyPress()返回的Promise并没有被resolve或reject,外部的await会一直等待这个悬而未决的Promise,导致后续代码永远无法执行。

而你的函数形式代码看似能工作,其实是因为非严格模式下函数中的this指向全局对象,递归调用的waitForKeyPress()会重新创建新的Promise链,但最初的Promise同样处于悬而未决状态,只是你没注意到后续的console.log来自新的调用链,而非最初的doStuff执行流程。

修复方案一:保持监听器直到正确按键(更高效)

不需要递归,错误按键时不移除监听器,持续等待正确的"z"键:

class exampleClass {
    async waitForKeyPress() {
        return new Promise((resolve) => {
            const listener = (e) => {
                if(e.key === "z") {
                    document.body.removeEventListener("keydown", listener);
                    resolve();
                }
                // 错误按键时不做操作,继续监听
            }
            document.body.addEventListener("keydown", listener);
        });
    }

    async doStuff() {
        await this.waitForKeyPress();
        console.log("correct key pressed");
        // do stuff
    }
}

let exampleObject = new exampleClass();
exampleObject.doStuff();

修复方案二:修正递归逻辑(保留递归思路)

如果一定要用递归,需要让新的Promise结果传递到最初的Promise中,确保外部await能正确等待:

class exampleClass {
    async waitForKeyPress() {
        return new Promise(async (resolve) => {
            const listener = async (e) => {
                document.body.removeEventListener("keydown", listener);
                if(e.key === "z") {
                    resolve();
                } else {
                    // 等待递归调用的Promise完成后,再resolve最初的Promise
                    await this.waitForKeyPress();
                    resolve();
                }
            }
            document.body.addEventListener("keydown", listener);
        });
    }

    async doStuff() {
        await this.waitForKeyPress();
        console.log("correct key pressed");
        // do stuff
    }
}

let exampleObject = new exampleClass();
exampleObject.doStuff();

内容的提问来源于stack exchange,提问作者Panda Cool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:45:08