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

时间:2018-08-15 16:53:56

标签: javascript node.js multithreading electron wait

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

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

  1. 开始循环
  2. 发送字符串到设备
  3. 等到具体回复回来
  4. 告诉渲染线程有关响应的信息,以便它可以更新UI
  5. 然后,重复下一个字符串。

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

这与我的最后一个问题 What's the correct way to run a function asynchronously in Electron? 有关。由此,我知道我应该使用Web Worker来异步运行某些东西。但是,我的计划原来涉及的问题比我预期的要多,我想问一问,要实现整个计划,而不仅仅是计划的某个方面,什么是实现此计划的好方法。

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


(由于这个问题具有更一般的性质,所以我不确定是否应该提供一些代码片段。如果是通用的,我可以尝试编写一些伪代码以使问题更清楚。)

1 个答案:

答案 0 :(得分:1)

我会采用这样的基于承诺的方法:

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)
    })
}