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?