我想写一个readKey
函数async
,然后await
在浏览器中按下每个键。
我想将其构建为基于async
- await
的同步,看似正常的代码。
那么我可以写一个readLine
函数执行await readKey()
直到用户点击[enter],并删除最后一个键,如果用户点击[返回]等等。
然后我可以编写await readLine()
的函数,并编写调用它们的函数等等。
我只是不知道如何弥合编写document.onkeypress
处理程序之间的差距......并将该事件中的密钥放入我编写的某个async readKey
函数中。在其他语言中,我可以使用其他多线程原语来实现,但我无法弄清楚如何在js中。我试图找出是否有某种方式来yield
这个值,但我也看不出怎么做。
答案 0 :(得分:4)
是。让我们分解一下:
是否有可能等待自定义事物?
是的 - 您可以等待任何Promise
。例如,等待超时:
const timerPromise = new Promise(resolve => setTimeout(resolve, 1000));
await timerPromise;
是否可以承诺按键?
是 - 在事件发生时解决承诺。
function readKey() {
return new Promise(resolve => {
window.addEventListener('keypress', resolve, {once:true});
});
}
答案 1 :(得分:3)
感谢@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));
}());
答案 2 :(得分:0)
这将等到元素上的按键事件发生
await new Promise(r=>element.addEventListener('keypress', r));
或者一个等待任何类型事件的函数,看起来像这样
waitForEvent = (element, type) => new Promise(r=>element.addEventListener(type,r));
然后我们可以做类似的事情
await waitForEvent(document, "load");
// or
await waitForEvent(element, "keypress");