2010-03-09 16 views
5

Tengo una función checkEvery15Seconds que se ejecuta cada 15 segundos. Verifica si se han agregado nuevos comentarios a una página.¿Cómo bloquear las funciones AJAX de la superposición?

Tengo un formulario que envía un nuevo comentario una vez que se presiona el botón Enviar, luego muestra el nuevo comentario en la página.

En el proceso de agregar un nuevo comentario checkEvery15Seconds está consultando la base de datos al mismo tiempo, así que termino con comentarios duplicados en la página (no en la base de datos, esto es un problema de JavaScript).

¿Cómo puedo obtener mi función "submitComment" para detener checkEvery15Seconds y reiniciarlo después de que la función "submitComment" haya terminado de ejecutarse?

+0

Como solución alternativa, solo asegúrese de no agregar el comentario a la página si ya está allí, por el ID del comentario. Haga que el contenedor de comentarios HTML que agregue tenga un id. "Comment_N" y luego verifique ese elemento antes de agregar uno nuevo. – Nicole

Respuesta

4

agregue un booleano llamado algo suspend15sCheck en un ámbito al que puedan acceder ambas funciones. habilítelo al agregar el comentario y luego configúrelo como falso nuevamente.

en su 15sCheck-función, para comprobar si se le permite comprobar :-)

var suspend15sCheck = false; 

function addComment() 
{ 
    suspend15sCheck = true; 

    // add comment on base of form data 

    suspend15sCheck = false; 
} 

function myTimer() 
{ 
    if(suspend15sCheck === false) 
    { 

     // add comments via ajax request 
     // remember to check if the comments who will be added already exist :-) 

    } 
} 
+0

eso es exactamente lo que quiero hacer. ¿Cómo creo una variable global como esa? – Andrew

+0

acaba de declararlo fuera de cualquier otra función, entonces puede acceder a él globalmente. –

0

Envuélvelo en un objeto que permita a otras funciones establecer indicadores de inicio/parada en él.

function My15SecondsObj() { 
    var objSelf = this; 

    // 
    this.run(); 
} 

My15SecondsObj.Paused = false; 
My15SecondsObj.prototype.run= function() { 
    if (!Paused) 
    { 
     // Do your call here 
    } 
    var _this = this; 
    setTimeout(function() { _this.run(); }, 15000); 

} 

Ahora cuando se quiere utilizar este objeto, simplemente

var myObj = new My15SecondsObj(); 

y cuando se quiere hacer una pausa,

myObj.Paused = true; 

y empezar de nuevo haciendo:

myObj.Paused = false; 

Agregue algunos eventos si desea g y realmente loco, para que otros objetos puedan suscribirse a las notificaciones sobre cuándo las actualizaciones de la base de datos han tenido éxito, etc.

0

Solución más simple: utilice una variable de marcación que enciende y apaga. La primera línea de su función "checkEvery15Seconds" dice: if (!global_checkingEvery15Seconds) return;

Simplemente establezca esa variable (cualquiera que sea su nombre, global o vinculada a un objeto) en verdadero cuando desee que se active la verificación y desactivada cuando no lo haga.

0

Tendrá una variable de estado para indicar el estado actual de la solicitud comentario ajax

var requestComments = false; 

if(requestComments === false) { 
    requestComments = true; 
    // make ajax request 

    // on ajax success/fail 
    requestComments = false; 
} 
Cuestiones relacionadas