El caso es que tengo una clase que valida los valores y los resultados deben generarse con el método document.getElementById().innerHTML. Sin embargo, la segunda parte de mi lógica funciona solo después de hacer doble clic en el botón 'enviar'. Aquí el código del archivo principal:
obj = new Validation() async function validate(){ await obj.api_secret_key(); await obj.currency(); await obj.quantity(); await obj.pnl(); } function start(){ let error_handler = ''; for (i in obj.validation_dict){ if (obj.validation_dict[i] === 'error'){ error_handler = i; break; } } if (error_handler !== ''){ error_msg = ` <p>Some parameters set improperly!</p> <p>Please, check ${error_handler}.</p> `; console.log(error_msg); document.getElementById('terminal').innerHTML = error_msg; } else { document.getElementById('terminal').innerHTML = "Successful connection!"; } } jQuery('#btn_start').on('click',async function(){ validate(); start(); });No he representado la clase de validación porque hay muchos archivos (2 python, 1 js). La clase tiene una variable donde almacena los resultados (error, advertencia, éxito):
this.validation_dict = { 'keys' : "not set", 'currency': "not set", 'quantity': "not set", 'pnl': "not set" };Todas las funciones de la clase son asíncronas para poder esperar la ejecución de la parte del servidor (módulo anguila):
async quantity() { let quantity = document.getElementById("input_quantity").value; let result = await eel.quantity_input(quantity)(); this.setter_status('quantity', result); if (result.indexOf("[ERROR]") == -1) this.info_account['quantity'] = quantity; }Probablemente, olvidé agregar que si declaro la función start() como método de clase, entonces funciona bien. Como vio, la clase solo para validación, por lo tanto, declarar el método de clase no es una salida.
Alguna adición de la validación: await eel.quantity_input(quantity)(); hace el proceso y lo crea el módulo anguila en Python:
import eel @eel.expose def quantity_input(qty=""): is_valid = validation_obj.quantity_checker(qty=qty) print(is_valid) return is_validEntra en la función:
def quantity_checker(self, qty = ""): qty = float(qty) if qty < 10: return "[ERROR] The quantity is lower 10 dollars" return "[SUCCESS] The quantity is right"No está esperando a que validate() finalice antes de llamar a start() , por lo que verá el estado inicial de obj.validation_dict (o el estado resultante del clic anterior), antes de que se modifique de forma asíncrona. Cambia tu código a
jQuery('#btn_start').on('click', async function(){ await validate(); // ^^^^^ start(); });