简体   繁体   中英

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

I am working on a project where my Electron App interacts with a physical device using serial commands, via serialport . The app sends a string to the device, the device executes the command (which can take ~30s) and then sends back a string to signify completion and results from that operation.

My goal is to automate a series of actions. For that, basically the following needs to be done asynchronously , so that the render thread doesn't get blocked:

  1. Start a loop
  2. Send a string to the device
  3. Wait until a specific response comes back
  4. Tell the render thread about the response, so it can update the UI
  5. Afterwards , repeat with the next string.

Actually, multiple different commands need to be send in each loop cycle, and between each one the app has to wait for a specific string from the device.

This is kind of related to my last question, What's the correct way to run a function asynchronously in Electron? . From that, I know I should use web workers to run something asynchronously. However, my plan turned out to involve more problems than I anticipated, and I wanted to ask what would be a good way to implement this, having the whole plan in mind and not just a certain aspect of it.

I am especially not sure how to make the worker work with serialport . The serial device it needs to interact with is a child of the render process, so sending commands will probably be done over web worker messages. But I have no idea on how to make the worker wait for a specific response from the device.


(Since this question is of a more general nature, I am unsure whether I should provide some code snippets. If this is to general, I can try to write some pseudo code to make my problem more clear.)

I would go for a promise-based approach like this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM