2017-06-25 51 views
3

我想写一个readKey函数,这个函数是async,然后await每个键在浏览器中被按下。有没有办法编写响应onkeypress事件的异步等待代码?

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

于是我可以写一个readLine函数,它await readKey(),直到用户点击[Enter]键,并删除最后一个关键,如果用户点击[返回]等

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

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

+0

另一种方式要问的是,为什么我不能 “等待document.readKey()”? –

+0

这是怎么了粗鲁。除了我,我什么都没说。也许你应该对自己保持建议 –

回答

3

是的。让我们来分解它:

是否有可能等待一个自定义的东西?您可以等待任何Promise。例如,要等待超时:

const timerPromise = new Promise(resolve => setTimeout(resolve, 1000)); 
await timerPromise; 

是否有可能对按键有承诺?

是 - 解决事件发生时的承诺。

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

如果它有任何可能像OP描述的那样行为,那么整个应用程序需要被包含在一个'async' IIFE中吗? '(async function(){...}());'https://jsfiddle.net/9yn4nnr6/ – Xotic750

1

感谢@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)); 
}());