Tengo 2 funciones que se llaman dentro de generateActivity, devuelve una promesa, sin embargo, cuando consola. Las registro dice indefinido. Creo que se debe a la forma en que se realizan las funciones getSessionUser y getSessionTimer.
function getSessionUser() { win.webContents.executeJavaScript('sessionStorage.getItem("user");', true) .then(result => { if(result) { return JSON.parse(result); } }); } function getSessionTimer() { win.webContents.executeJavaScript('sessionStorage.getItem("timer");', true) .then(result => { if(result) { return JSON.parse(result); } }); } function generateActivity() { var user = getSessionUser(); var timer = getSessionTimer(); console.log(user); // undefined but should not be console.log(timer); // undefined but should not be if(user && timer) { activity.user = user; activity.timer = timer; var data = { activity: activity } axios.post("http://creaz:81/xorix/api/desktop/save_activity", data, { headers: headers }) .then((response) => { //console.log(response); }) .catch((error) => { //console.log(error); }) activity.is_mouse = activity.is_keyboard = 0; } else { console.log('not logged in or no timer is running'); // says undefined for both user and timer variable } }Creo que puedes usar async/await para esto. Hacer generarActividad asíncrona:
async function generateActivity() { … }Y luego espere a que las funciones devuelvan sus resultados:
const user = await getSessionUser(); const timer = await getSessionTimer();Espero que esto ayude.
Su getSessionUser() y getSessionTimer() también necesitan devolver una promesa. Ambas funciones son funciones asíncronas, pero su código dentro de generateActivity las trata como funciones síncronas. Debe esperar a que se resuelva la promesa antes de poder consolar. registrar el resultado.
function getSessionUser() { return win.webContents.executeJavaScript('sessionStorage.getItem("user");', true) .then(result => { if(result) { return JSON.parse(result); } }); } function getSessionTimer() { return win.webContents.executeJavaScript('sessionStorage.getItem("timer");', true) .then(result => { if(result) { return JSON.parse(result); } }); } Luego, dentro de generateActivity() , debe esperar a que se resuelva la promesa. Podemos usar las palabras clave async await para hacer esto más fácil.
async function generateActivity() { var user = await getSessionUser(); var timer = await getSessionTimer(); // Now we wait for the async calls to resolve before continuing the execution inside this function. } Dado que getSessionUser y getSessionTimer son independientes, podemos mejorar el fragmento de código anterior ejecutando ambas funciones al mismo tiempo, pero espere a que ambas promesas se resuelvan antes de continuar con el resto de la ejecución del código. (Dejo esto como un ejercicio/desafío para OP)