How to handle asynchronous tasks with actioncable subscriptions

48 views Asked by At

I have an Electron application that uses actioncable to receive messages with subscriptions. I need to elaborate every message with some async function.

Cable connection and sending to renderer
cable.subscribe(msgUpdate, {
  connected() {
    console.log("connected");
  },

  disconnected(error) {
    console.log("disconnected", error);
  },

  rejected(error) {
    console.log("rejected", error);
  },

  received(data) {
    if (data?.result?.errors?.length > 0) {
      console.log("error", data?.result?.errors);
      return;
    }
    const msg = data?.result?.data;
    win.webContents.send("sendSubs", msg);
  },
});
Electron main to renderer handling
contextBridge.exposeInMainWorld('api', {
  sendSubs: (callback) => (
    ipcRenderer.on('sendSubs', (_event, value) => callback(value))
  )
};
Renderer data elaboration
window.api.sendSubs(async (value) => {
  console.log(value);
  let floor = await getSubsFloor(value);
  console.log(floor);
  let result = floor / value;
  console.log(result);
});
getSubsFloor()
async function getSubsFloor(value) {
...
...
  let floor = some elaboration on value...
...
...
  console.log(floor);
  return floor;
}

I added async to the callback on the renderer to enable await.

What happens on the console:

  • renderer => console.log(value) ==> OK
  • renderer => console.log(floor) ==> undefined

Then after a while... and some others value OK of other msgs.

  • getSubsFloor => console.log(floor) ==> OK
  • renderer => console.log(result) ==> never reached

How to handle this situation?

0

There are 0 answers