javascript - 如何将旧的(非事件驱动的)软件移植到 javascript
问题描述
我想将一些旧软件移植到 javascript。这些程序通常不是事件驱动的,只是循环运行。他们只会暂停以从输入流中获取输入。我不能只将它们转换为 javascript,因为经典的 pascal 或 c 读取指令没有等价物。我认为可以使用会触发 onchange 事件的输入字段。然后我的程序将被暂停,直到事件触发。但显然你不能暂停一个 JS 程序。
我的第二次尝试是在 onchange 事件上设置一个标志。我的程序一直处于循环状态,直到设置标志,然后读取输入字段的值。但是为了防止浏览器被这个循环阻塞,我需要在两个轮询之间使用一些睡眠功能。显然,在 JS 中没有等效的睡眠功能。
如何才能做到这一点 ?
解决方案
你可以使用 Promises 和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">
以这种方式解决它是否是一个好主意取决于确切的用例。一般来说,您应该检查您想要执行的任务应该如何在新环境中解决,而不是强制旧样式进入新环境。
推荐阅读
- c++ - 如何将 vscode 指向正确的头文件?
- python - 没有请求的 Django 测试 render_to_string()
- php - 登录woocommerce后在首页看不到价格
- string - 如何从我们从外部源动态发送的字符串中删除“_”
- flutter - video_player 包中的 YouTube 视频
- arrays - 在 Haskell 中有效地迭代多个数组/列表的前缀
- python - 数据框之间的比较:检查一个数据框的列的值是否在另一个数据框的列内的列表中
- tensorflow - MultiHeadAttention (TensorFlow/Keras) 中填充序列的效果
- c++ - 如何只读取文件的一半?
- powerbi - Power BI 无法处理数据集计划刷新中的错误