2012-04-19 8 views
10

Sto facendo davvero semplice applicazione per aiutarmi a scoprire nodejs e ho un particolare gestore che genera il codice HTML sulla base dei messaggi Top10 nel mio database. Lo snippet Sto avendo problemi con i loop attraverso i messaggi e chiama la funzione che genera HTML e aggiunge il risultato alla mia stringa html.Node.js per() ciclo di ritorno gli stessi valori ad ogni ciclo

function CreateMessageboard(BoardMessages){ 
    var htmlMessageboardString = ""; 

    [... Console debug code ...] 

    for(var i = 0; i < BoardMessages.length;i++){ 
     (function(){ 
      var j = i; 
      console.log("Loading message %d".green, j); 
      htmlMessageboardString += MessageToHTMLString(BoardMessages[j]); 
      })(); 
    } 
} 

Penso che il mio problema è dovuto al modo di gestire cicli, legati alla chiusura da quanto ho letto sia di Javascript e questo è quello che ho provato ad utilizzare al di sopra o il modo asincrono nodejs gestisce la mia funzione. In questo momento i 10 risultati sono ben restituiti dal db ma l'ultimo messaggio viene elaborato ad ogni ciclo.

ho anche provato, invece di fare var j = i, per prendere i valore come parametro di funzione e passarlo nella chiusura e tornati gli stessi risultati comunque.

Ho la sensazione che mi manca la conoscenza fondamentale per risolvere il mio problema, posso avere luce su questo argomento?

Modifica: Sono libero di fornire altre informazioni sul codice, pubblicherei l'intero repository Git ma probabilmente le persone non vogliono nuotare attraverso un intero progetto per aiutarmi a eseguire il debug di questo problema, quindi ho postato il tutta la funzione nei commenti per fornire più contesto.

+3

Dovrebbe funzionare anche senza la funzione, dal momento che non si hanno altre chiusure che potrebbero catturare involontariamente 'i'. È questo il tuo codice esatto? –

+0

Come dice @MatthewFlaschen, il codice sembra buono. Tuttavia, puoi provare 'function (i) {......}) (i);' così che non ci sia dubbio che 'i' viene catturato. –

+2

Sospetto che sia necessario includere più contesto; l'errore non sembra essere qui – Kato

risposta

16
for(var i = 0; i < BoardMessages.length;i++){ 
     (function(j){ 
      console.log("Loading message %d".green, j); 
      htmlMessageboardString += MessageToHTMLString(BoardMessages[j]); 
     })(i); 
    } 

che dovrebbe funzionare; tuttavia, non si dovrebbe mai creare una funzione in un ciclo. Pertanto,

+2

Non c'è niente di sbagliato nel creare una funzione anonima in un ciclo, purché l'ambito sia eseguito correttamente. –

+1

@MatthewFlaschen, o prendi la complessità dell'ottimizzazione corretta dell'equazione. – Joe

3

vorrei suggerire di fare questo in uno stile più funzionale: P

function CreateMessageboard(BoardMessages) { 
    var htmlMessageboardString = BoardMessages 
    .map(function(BoardMessage) { 
    return MessageToHTMLString(BoardMessage); 
    }) 
    .join(''); 
} 

Prova questo