¿Cuál es la forma correcta de ejecutar una función de forma asincrónica en Electron?

Quiero ejecutar una función simple de forma asincrónica en Electron, para que no bloquee mi hilo de renderizado. Entonces, algo (más o menos) como este (dentro derender.js):

var max = 42; // Somehow needs to be passed to the function

function foo() {
    for (var i = 0; i < max; i++) {
        // Do something...
        // ... and tell the render thread about it.
    }
}

foo(); // Should run asynchronously

Hay dos requisitos:

Debo pasar parámetros a la función (aquí:max). Estos no solo podrían ser enteros, sino también objetos. La función no debe ejecutarse antes de recibir estos parámetros.Mientras se ejecuta, debe haber un canal de comunicación para el hilo de renderizado. Por ejemplo, para informar periódicamente el progreso desde elfor bucle hasta la interfaz de usuario, o para cancelar la función cuando se desencadena un evento en el hilo de renderizado.

Aquí hay un trabajo mínimo más específico (o mejor dicho, no funciona) ejemplo. El propósito es enviar comandos seriales a un aparato físico, en el cual una sonda se debe mover a todas las ubicaciones en una cuadrícula específica. Entonces necesito dos bucles (uno para x, uno para y). El cuerpo del bucle contendrá funciones que se bloquean hasta que los motores se hayan movido, por lo que una medición desde esa ubicación debe comunicarse de nuevo a la interfaz de usuario. Además, antes de que los bucles comiencen a ejecutarse, deben conocerse las especificaciones sobre la cuadrícula (de ahí mi requisito sobre pasar parámetros).

var Parameters = {x_length: 50, y_length: 50};

//These functions interact with a serial device and block until it is done with its task
function moveTo(x, y) {/*...*/};
function measure() {/*...*/};

//This function should eventually be executed asynchronously
function scan() {

    for (var x = 0; x < Parameters.x_length; x++) {
        for (var y = 0; y < Parameters.y_length; y++) {

            moveTo(x, y);
            var result = measure();

            // Here, we need to tell the render thread about results. I used
            // postMessage (WebWorker syntax) as a placeholder.
            postMessage({
                position: {x: x, y: y},
                data: result
            });
        }
    }
}

// This is what will be actually called, e. g.  when the user clicks a
// button. 
function scan_async() {
    //Again, I used WebWorker (or rather, TinyWorker) syntax as a placeholder.
    var scan_worker = new Worker(scan);

    scan_worker.onmessage = function (msg) {
        console.log(msg.data);
    };
}

Después de horas de googlear muy frustrante, encontré muchos enfoques, pero ninguno de ellos parece ser la forma "definitiva" de hacerlo, o no cumple con los puntos anteriores, o parece demasiado complicado para lo que quiero lograr. .

Lo que encontré hasta ahora:

Realmente usando WebWorkers (o más bien algo TinyWorkers,https: //github.com/avoidwork/tiny-worke), como en el código anterior. Aquí, parece que no hay una forma elegante de pasar los parámetros de inicio antes de que el trabajador comience a ejecutarse.Cree una nueva @ oculBrowserWindow, como se mencionóaqu. Sin embargo, no puedo encontrar nada sobre este método en otra parte.

Entonces, ¿hay una forma "correcta" y más directa de lograr mi objetivo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta