2010-03-09 14 views
5

Ho una funzione checkEvery15Seconds che viene eseguita ogni 15 secondi. Controlla se nuovi commenti sono stati aggiunti a una pagina.Come bloccare le funzioni AJAX dalla sovrapposizione?

Ho un modulo che invia un nuovo commento una volta premuto il pulsante di invio, quindi visualizza il nuovo commento sulla pagina.

In fase di aggiunta di un nuovo commento, checkEvery15Seconds sta interrogando il database contemporaneamente, quindi alla fine ricilo con commenti duplicati sulla pagina (non nel database, si tratta puramente di un problema JavaScript).

Come è possibile ottenere la funzione "submitComment" per interrompere checkEvery15Seconds e riavviarla dopo che la funzione "submitComment" ha terminato l'esecuzione?

+0

Come soluzione alternativa, assicurati di non aggiungere il commento alla pagina se è già presente, dall'ID del commento. Rendi il contenitore di commenti HTML che hai aggiunto un ID "comment_N" e poi controlla quell'elemento prima di aggiungerne uno nuovo. – Nicole

risposta

4

aggiungere un booleano chiamato in qualche modo suspend15sCheck in un ambito accessibile a entrambe le funzioni. abilitarlo mentre aggiungi il commento e poi lo imposta nuovamente su falso.

nel vostro 15sCheck funzione bisogna prima controllare se si è permesso di controllare :-)

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

questo è esattamente quello che voglio fare. come posso creare una variabile globale come quella? – Andrew

+0

basta dichiararlo da ogni altra funzione, quindi puoi accedervi globaly. –

0

Avvolgere in un oggetto che consente ad altre funzioni di impostare i flag di avvio/arresto su di esso.

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); 

} 

Ora, quando si desidera utilizzare questo oggetto, basta fare

var myObj = new My15SecondsObj(); 

e quando si desidera mettere in pausa essa,

myObj.Paused = true; 

e riavviarlo facendo:

myObj.Paused = false; 

Aggiungi alcuni eventi se si desidera E davvero pazzo, in modo che altri oggetti possano iscriversi alle notifiche su quando gli aggiornamenti del database sono riusciti, ecc ...

0

La soluzione più semplice: utilizzare una variabile di segnalazione che si accende e si spegne. La prima riga della funzione "checkEvery15Seconds" si legge: if (!global_checkingEvery15Seconds) return;

Basta impostare la variabile (qualunque cosa è il nome, globale o object-bound) su true quando si desidera che il controllo acceso, e si spegne quando non lo fai.

0

Avrete bisogno di una variabile di stato per indicare lo stato corrente della richiesta di commento ajax

var requestComments = false; 

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

    // on ajax success/fail 
    requestComments = false; 
} 
Problemi correlati