使用 Electron/Node.js,如何异步实现简单的顺序代码?

With Electron/Node.js, how do I implement simple sequential code asynchronously?

我正在做一个项目,我的 Electron 应用程序通过 serialport 使用串行命令与物理设备交互。应用程序向设备发送一个字符串,设备执行命令(可能需要大约 30 秒),然后发回一个字符串以表示该操作的完成和结果。

我的目标是自动执行一系列操作。为此,基本上需要异步完成以下操作,以便渲染线程不会被阻塞:

  1. 开始循环
  2. 向设备发送字符串
  3. 等到特定响应返回
  4. 将响应告诉渲染线程,以便它可以更新 UI
  5. 之后,重复下一个字符串。

实际上,在每个循环周期中需要发送多个不同的命令,并且在每个命令之间,应用程序必须等待来自设备的特定字符串。

这与我的上一个问题有点相关,What's the correct way to run a function asynchronously in Electron?。从那以后,我知道我应该使用 web workers 异步地 运行 一些东西。然而,我的计划结果涉及的问题比我预期的要多,我想问一下什么是实施这个计划的好方法,考虑到整个计划,而不仅仅是计划的某个方面。

我特别不确定如何让工作人员与 serialport 一起工作。它需要与之交互的串行设备是渲染进程的子进程,因此发送命令可能会通过 web worker 消息完成。但是我不知道如何让工作人员等待设备的特定响应。


(由于这个问题比较笼统,我不确定是否应该提供一些代码片段。如果这是笼统的,我可以尝试写一些伪代码来使我的问题更清楚。)

我会选择这样一种基于承诺的方法:

let promiseChain = Promise.resolve();

waitForEvent = function(){
    return new Promise(resolve=>{
        event.on("someEvent", (eventData => {
            resolve(eventData)
         }))
    })

}

while(someLoopCondition) {
    promiseChain = promiseChain
    .then(sendToSerialPort(someString))
    .then(waitForEvent)
    .then(result=>{
        updateUI(result)
    })
}