如何端口旧的(不是事件驱动)软件的JavaScript

问题描述 投票:0回答:2

我想将一些旧软件的JavaScript。这些程序通常不是事件驱动的,只是把在一个循环。他们只能暂停从输入流中获取输入。我不能只将它们转换为JavaScript的,因为有没有类似的经典C或Pascal读指令。我认为这将有可能使用的输入字段,将触发一个onchange事件。然后我的程序将被暂停,直到事件触发。但很显然,你不能暂停JS程序。

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

如何才能做到这一点 ?

javascript porting
2个回答
2
投票

你可以使用的承诺和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">

如果是解决这个问题一个很好的想法,方式取决于具体的使用情况。一般来说,你应该检查你如何要执行的任务应该在新的环境来解决,而不是迫使老风格融入新的环境。


1
投票

如果你从不会像语言来...

while(true) {
  x = readInput();
  processInput(x);
}

然后,你是正确的,有在JavaScript中没有直接等效。你需要忘记循环,而是认为,用户输入发生在你的循环是块之前作为设置事件的一部分,之后发生的为处理该事件的回调一切的一切。

上述(很简单)计划将在JavaScript中被改写为这样的:

readInput().then((x) => { processInput(x) });
© www.soinside.com 2019 - 2024. All rights reserved.