Perulangan Node.js for() mengembalikan nilai yang sama pada setiap perulangan

Saya membuat aplikasi yang sangat sederhana ini untuk membantu saya menjelajahi nodejs dan saya memiliki handler tertentu yang menghasilkan kode HTML berdasarkan 10 pesan teratas di database saya. Cuplikan yang saya alami masalah dengan loop melalui pesan dan memanggil fungsi yang menghasilkan HTML dan menambahkan hasilnya ke string html saya.

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]);
          })();
  }
}

Saya pikir masalah saya adalah karena cara Javascript'menangani loop, terkait dengan penutupan dari apa yang saya baca dan inilah yang saya coba gunakan di atas atau cara async nodejs menangani fungsi saya. Saat ini 10 hasil dikembalikan dengan baik dari db tetapi pesan terakhir diproses di setiap loop.

Saya juga mencoba, alih-alih melakukan var j = i, untuk mengambil nilai i sebagai parameter fungsi dan meneruskannya ke dalam penutupan dan hasilnya tetap sama.

Saya merasa saya kehilangan pengetahuan penting untuk menyelesaikan masalah saya, bisakah saya mendapatkan pencerahan tentang masalah ini?

Edit: Saya dipersilakan untuk memberikan info lain tentang kode, saya akan memposting seluruh repo git tetapi orang-orang mungkin tidak ingin berenang melalui seluruh proyek untuk membantu saya men-debug masalah ini, jadi saya memposting seluruh fungsi di komentar untuk memberikan lebih banyak konteks.

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

Itu seharusnya berfungsi; namun, Anda tidak boleh membuat fungsi dalam sebuah loop. Oleh karena itu,

  for(var i = 0; i < BoardMessages.length;i++){
        composeMessage(BoardMessages[i]);
  }

  function composeMessage(message){
      console.log("Loading message %d".green, message);
      htmlMessageboardString += MessageToHTMLString(message);
  }
Komentar (2)

Saya akan menyarankan untuk melakukan ini dalam gaya yang lebih fungsional :P

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

Coba ini

Komentar (0)