我想将一些旧软件的JavaScript。这些程序通常不是事件驱动的,只是把在一个循环。他们只能暂停从输入流中获取输入。我不能只将它们转换为JavaScript的,因为有没有类似的经典C或Pascal读指令。我认为这将有可能使用的输入字段,将触发一个onchange事件。然后我的程序将被暂停,直到事件触发。但很显然,你不能暂停JS程序。
我的第二次尝试设置一个标志上的onchange事件。我的程序停留在一个循环,直到设置了标志,然后读取输入字段的值。但是,为了防止浏览器被阻塞通过这个循环,我需要在两次轮询之间的一些睡眠功能。显然没有在JS睡眠功能的等价物。
如何才能做到这一点 ?
你可以使用的承诺和await
/ async
创建代码,看起来像你阻塞代码知道是什么。
但要注意,这不会阻止代码是很重要的。在await
其他代码等待被执行的可交错。
function waitForIntput(id) {
// create a Promise that resolves at the input event
return new Promise((resolve, reject) => {
let elm = document.getElementById(id)
function listener(evt) {
// remove the listener so that no memory leaking occures
elm.removeEventListener('input', listener)
// resolve the promise with the current value of the element
resolve(elm.value)
}
// call the listener on the input event
elm.addEventListener('input', listener, false);
})
}
(async function() {
while(true) {
console.log('before waitForIntput')
console.log(await waitForIntput('test'))
console.log('after waitForIntput')
}
}())
<input id="test">
如果是解决这个问题一个很好的想法,方式取决于具体的使用情况。一般来说,你应该检查你如何要执行的任务应该在新的环境来解决,而不是迫使老风格融入新的环境。
如果你从不会像语言来...
while(true) {
x = readInput();
processInput(x);
}
然后,你是正确的,有在JavaScript中没有直接等效。你需要忘记循环,而是认为,用户输入发生在你的循环是块之前作为设置事件的一部分,之后发生的为处理该事件的回调一切的一切。
上述(很简单)计划将在JavaScript中被改写为这样的:
readInput().then((x) => { processInput(x) });