首页 > 解决方案 > 如何将旧的(非事件驱动的)软件移植到 javascript

问题描述

我想将一些旧软件移植到 javascript。这些程序通常不是事件驱动的,只是循环运行。他们只会暂停以从输入流中获取输入。我不能只将它们转换为 javascript,因为经典的 pascal 或 c 读取指令没有等价物。我认为可以使用会触发 onchange 事件的输入字段。然后我的程序将被暂停,直到事件触发。但显然你不能暂停一个 JS 程序。

我的第二次尝试是在 onchange 事件上设置一个标志。我的程序一直处于循环状态,直到设置标志,然后读取输入字段的值。但是为了防止浏览器被这个循环阻塞,我需要在两个轮询之间使用一些睡眠功能。显然,在 JS 中没有等效的睡眠功能。

如何才能做到这一点 ?

标签: javascriptporting

解决方案


你可以使用 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">

以这种方式解决它是否是一个好主意取决于确切的用例。一般来说,您应该检查您想要执行的任务应该如何在新环境中解决,而不是强制旧样式进入新环境。


推荐阅读