如何将旧的(非事件驱动的)软件移植到javascript
我想将一些旧软件移植到javascript。这些程序通常不是事件驱动的,只是循环运行。它们只是暂停以从输入流获取输入。我不能仅仅将它们转换为javascript,因为经典的pascal或c read指令没有等价物。我认为可以使用一个输入字段来触发onchange事件。我的程序将被暂停,直到事件触发。但显然你不能挂起JS程序 我的第二次尝试是在onchange事件上设置一个标志。我的程序一直处于循环中,直到设置标志,然后读取输入字段的值。但是为了防止浏览器被这个循环阻塞,我需要在两次轮询之间使用一些睡眠功能。显然,JS中没有等效的睡眠函数如何将旧的(非事件驱动的)软件移植到javascript,javascript,porting,Javascript,Porting,我想将一些旧软件移植到javascript。这些程序通常不是事件驱动的,只是循环运行。它们只是暂停以从输入流获取输入。我不能仅仅将它们转换为javascript,因为经典的pascal或c read指令没有等价物。我认为可以使用一个输入字段来触发onchange事件。我的程序将被暂停,直到事件触发。但显然你不能挂起JS程序 我的第二次尝试是在onchange事件上设置一个标志。我的程序一直处于循环中,直到设置标志,然后读取输入字段的值。但是为了防止浏览器被这个循环阻塞,我需要在两次轮询之间使用一
如何做到这一点 如果你来自一种类似于
while(true) {
x = readInput();
processInput(x);
}
那么你是对的,JavaScript中没有直接的等价物。您需要忘记循环,而是将循环阻塞用户输入之前发生的所有事情都看作是设置事件的一部分,之后发生的所有事情都看作是处理该事件的回调
上述(非常琐碎的)程序将用JavaScript重写如下:
readInput().then((x) => { processInput(x) });
如果你来自一种类似于
while(true) {
x = readInput();
processInput(x);
}
那么你是对的,JavaScript中没有直接的等价物。您需要忘记循环,而是将循环阻塞用户输入之前发生的所有事情都看作是设置事件的一部分,之后发生的所有事情都看作是处理该事件的回调
上述(非常琐碎的)程序将用JavaScript重写如下:
readInput().then((x) => { processInput(x) });
您可以使用Promises和
wait
/async
来创建代码,这些代码看起来就像您从阻塞代码中知道的一样
但需要注意的是,这不是阻塞代码。在wait
处,等待执行的其他代码可以交错
函数waitForIntput(id){
//创建在输入事件中解析的承诺
返回新承诺((解决、拒绝)=>{
设elm=document.getElementById(id)
函数侦听器(evt){
//删除侦听器,以便不会发生内存泄漏
elm.removeEventListener('input',listener)
//使用元素的当前值解析承诺
解析(elm.value)
}
//在输入事件上调用侦听器
elm.addEventListener('input',listener,false);
})
}
(异步函数(){
while(true){
console.log('beforeitfointput')
log(等待waitForIntput('test'))
console.log('after waitForIntput')
}
}())
您可以使用Promises和wait
/async
创建类似于您从阻塞代码中了解的代码
但需要注意的是,这不是阻塞代码。在wait
处,等待执行的其他代码可以交错
函数waitForIntput(id){
//创建在输入事件中解析的承诺
返回新承诺((解决、拒绝)=>{
设elm=document.getElementById(id)
函数侦听器(evt){
//删除侦听器,以便不会发生内存泄漏
elm.removeEventListener('input',listener)
//使用元素的当前值解析承诺
解析(elm.value)
}
//在输入事件上调用侦听器
elm.addEventListener('input',listener,false);
})
}
(异步函数(){
while(true){
console.log('beforeitfointput')
log(等待waitForIntput('test'))
console.log('after waitForIntput')
}
}())
JS已经有一个事件循环。您不需要在上面再设置一个。JS已经有了一个事件循环。你不需要在上面再设置一个。