有没有办法编写响应onkeypress事件的异步等待代码?

Mat*_*ank 7 javascript onkeypress async-await

我想编写一个readKey功能为async,然后await在浏览器中按每个键。

我想将其构建为全部基于async-的同步,外观正常的代码await

因此,我可以编写一个readLine函数,await readKey()直到用户单击[enter]为止,如果用户单击[back]等,则删除最后一个键,等等。

然后我可以编写函数await readLine(),并编写调用它们的函数,等等。

我只是不知道如何弥合编写document.onkeypress处理程序...和将该事件中的键放入async readKey我要编写的某些函数之间的差距。在其他语言中,我可以使用其他多线程原语到达那里,但是我不知道如何在js中使用。我试图找出是否有某种方法可以yield实现价值,但是我也看不出如何做到这一点。

Kor*_*nel 8

是。让我们分解一下:

是否可以等待自定义的东西?

是的-您可以等待任何一个Promise。例如,要等待超时:

const timerPromise = new Promise(resolve => setTimeout(resolve, 1000));
await timerPromise;
Run Code Online (Sandbox Code Playgroud)

是否可以承诺按键?

是的-当事件发生时兑现承诺。

function readKey() {
    return new Promise(resolve => {
        window.addEventListener('keypress', resolve, {once:true});
    });
}
Run Code Online (Sandbox Code Playgroud)

  • 整个应用程序是否需要包含在一个“异步” IIFE中,如果它有可能像描述的OP那样运行,它是否会包含在其中?`((异步函数(){...}());`https://jsfiddle.net/9yn4nnr6/ (4认同)

Mat*_*ank 6

感谢@Kornel和@ Xotic750,这就是我想要的:

const readKey = () => new Promise(resolve => window.addEventListener('keypress', resolve, { once: true }));

(async function() {
  console.log('Press a key');
  const x = await readKey();
  console.log('Pressed', String.fromCharCode(x.which));

  console.log('Press a key');
  const y = await readKey();
  console.log('Pressed', String.fromCharCode(y.which));
}());
Run Code Online (Sandbox Code Playgroud)