Mensajes de texto de actualización de estado de la consola
Tengo un script de Google Apps que muestra una única salida de aplicación web al final.
La duración del script es de aproximadamente ~20 segundos, y estoy buscando mejorar la experiencia del usuario mediante una actualización intermitente del estado del script durante este período.
Entiendo los desafíos de la operación asíncrona entre el servidor y el cliente, pero me sorprende que una funcionalidad “trivial” como esta parezca bastante difícil de lograr.
Revisé temas similares, pero no he encontrado un buen ejemplo.
Ejemplo de código:
function doGet(e){
output = function1();
output = function2();
return HtmlService.createHtmlOutput(output);
}
function function1() {
//Hacer algo
return “output1”;
}
function function2() {
//Hacer algo
return “output2”;
}
No busco reemplazar las llamadas de función por llamadas HTML. ¿Pero tal vez podría consultar continuamente una variable global hasta que se complete la ejecución del script, si esto es factible?
Para hacerlo más concreto:
code.gs:
var data = “test”;
Logger.log(data);
function doGet(){
return HtmlService.createHtmlOutputFromFile(‘index’);
}
function main() {
data = “1”;
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = “2”;
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = “3”;
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = “4”;
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
data = “5”;
pushMSG(data);
Logger.log(data);
Utilities.sleep(2000);
}
function pushMSG(str){
return str
}
index.html
<script>
google.script.run.main();
var i = 0;
var refreshId = setInterval( function () {
document.getElementById('output').innerHTML = data;
google.script.run.withSuccessHandler(onSuccess).pushMSG();
i = i + 1;
if (i > 10) {
clearInterval(refreshId);
document.getElementById('output').innerHTML = "hecho1";
}
}, 500);
function onSuccess(pushMSG) {
document.getElementById('output').innerHTML = data;
}
document.getElementById('output').innerHTML = "hecho2";
</script>
… pero no encuentro ninguna manera de mostrar la variable “data” válida.
davy.ai
Para mejorar la experiencia del usuario al actualizar intermitentemente el estado del script durante la ejecución, un enfoque es utilizar la comprobación del lado del cliente. Esto implica configurar un bucle en el código del lado del cliente que envía periódicamente solicitudes al servidor para verificar el estado del script y actualizar la pantalla en consecuencia.
Aquí hay una implementación de ejemplo utilizando el código existente:
Code.gs:
index.html:
Esto utiliza la función
setInterval
para enviar periódicamente solicitudes al servidor utilizandogoogle.script.run.withSuccessHandler
. La respuesta del servidor se pasa a la funciónonSuccess
, que actualiza la pantalla con el valor actual dedata
.La función
pushMSG
se utiliza para activar la funcióndoGet
en el lado del servidor, que volverá a ejecutar el script y actualizará el valor dedata
.Tenga en cuenta que la variable
data
en el lado del servidor es una variable global, y la funciónpushMSG
simplemente devuelve su valor. Esto permite que el código del lado del cliente recupere el valor actual dedata
sin necesidad de pasarla como parámetro.En el código proporcionado, la variable
data
no se muestra correctamente porque el código del lado del cliente intenta acceder a ella directamente, en lugar de utilizar la funciónonSuccess
para actualizar la pantalla. Cambiar la líneadocument.getElementById('output').innerHTML = data;
adocument.getElementById('output').innerHTML = pushMSG;
debería solucionar este problema.