Tengo una función llamada save(), esta función reúne todas las entradas en la página y realiza una llamada AJAX al servidor para guardar el estado del trabajo del usuario.Seguridad de subprocesos en Javascript?
save() se llama actualmente cuando un usuario hace clic en el botón Guardar o realiza alguna otra acción que requiere que tengamos el estado más actual en el servidor (por ejemplo, generar un documento desde la página).
Estoy agregando la capacidad de guardar automáticamente el trabajo del usuario de vez en cuando. Primero, me gustaría evitar que se ejecuten AutoSave y un guardado generado por el usuario al mismo tiempo. Así tenemos el siguiente código (estoy cortando la mayor parte del código y esto no es una relación 1: 1, pero debería ser suficiente para transmitir la idea de):
var isSaving=false;
var timeoutId;
var timeoutInterval=300000;
function save(showMsg)
{
//Don't save if we are already saving.
if (isSaving)
{
return;
}
isSaving=true;
//disables the autoSave timer so if we are saving via some other method
//we won't kick off the timer.
disableAutoSave();
if (showMsg) { //show a saving popup}
params=CollectParams();
PerformCallBack(params,endSave,endSaveError);
}
function endSave()
{
isSaving=false;
//hides popup if it's visible
//Turns auto saving back on so we save x milliseconds after the last save.
enableAutoSave();
}
function endSaveError()
{
alert("Ooops");
endSave();
}
function enableAutoSave()
{
timeoutId=setTimeOut(function(){save(false);},timeoutInterval);
}
function disableAutoSave()
{
cancelTimeOut(timeoutId);
}
mi pregunta es si este código es seguro? ¿Los principales navegadores permiten que se ejecute solo un hilo a la vez?
Lo único que pensé es que sería peor para el usuario hacer clic en guardar y no obtener respuesta porque estamos guardando automáticamente (y sé cómo modificar el código para manejar esto). ¿Alguien ve otros problemas aquí?
Así que basado en que si el usuario hace clic ahorrar el temporizador no dispararía hasta que termine la función de guardar? – JoshBerke
Si te entiendo correctamente, estás preguntando si el usuario ha iniciado un guardado, el setTimeout iniciado save save alguna vez ingrese el mismo método. La respuesta es no, no estarán en el método save() al mismo tiempo, nunca. –
¿Qué hacemos ya que esta información está un poco desactualizada? JavaScript ahora tiene varios hilos: https://developer.mozilla.org/En/Using_web_workers – jmort253