2017-06-25 79 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)); 
}());