我想把一些旧的软件移植到javascript。这些程序通常不是事件驱动的,而只是循环。它们只是暂停以从输入流获取输入。我不能仅仅将它们转换为javascript,因为经典的pascal或c读指令没有等效的内容。我认为可以使用输入字段来触发onchange事件。然后,我的程序将被暂停,直到事件发生。但很明显你不能暂停JS程序。
我的第二次尝试是在onchange事件上设置一个标志。我的程序一直处于循环状态,直到设置了标志,然后读取输入字段的值。但是为了防止浏览器被这个循环所阻塞,我需要在两次轮询之间提供一些睡眠功能。显然,在JS中没有类似于睡眠功能的功能。
这是如何做到的呢?
发布于 2019-02-09 19:07:39
您可以使用允诺和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">
如果解决这个问题是个好主意,那取决于具体的用例。通常,您应该检查要执行的任务是如何在新环境中解决的,而不是将旧的样式强加到新的环境中。
https://stackoverflow.com/questions/54608308
复制相似问题