2012-04-19 40 views
10

Tôi đang tạo ứng dụng thực sự đơn giản này để giúp tôi khám phá các nút và tôi có một trình xử lý cụ thể tạo mã HTML dựa trên 10 thông điệp trong cơ sở dữ liệu của tôi. Đoạn mã tôi đang gặp vấn đề với các vòng lặp thông qua các tin nhắn và gọi hàm tạo HTML và nối kết quả vào chuỗi html của tôi.Vòng lặp Node.js for() trả về cùng giá trị tại mỗi vòng

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

Tôi nghĩ rằng vấn đề của tôi là do cách xử lý vòng, liên quan đến việc đóng cửa từ những gì tôi đọc hoặc javascript và đây là những gì tôi đã cố gắng sử dụng trên hoặc cách async nodejs xử lý chức năng của tôi. Hiện tại, 10 kết quả được trả về từ db nhưng thông điệp cuối cùng được xử lý ở mọi vòng lặp.

Tôi cũng đã thử, thay vì thực hiện var j = i, để lấy giá trị i làm tham số hàm và chuyển nó trong phần đóng và nó cũng trả về kết quả tương tự.

Tôi có cảm giác mình thiếu kiến ​​thức quan trọng để giải quyết vấn đề của mình, tôi có thể xem nhẹ vấn đề này không?

Chỉnh sửa: Tôi được chào đón cung cấp bất kỳ thông tin nào khác về mã, tôi đăng toàn bộ repo git nhưng mọi người có thể không muốn bơi qua toàn bộ dự án để giúp tôi gỡ lỗi vấn đề này vì vậy tôi đã đăng toàn bộ chức năng trong các ý kiến ​​để cung cấp thêm ngữ cảnh.

+3

Nó sẽ hoạt động ngay cả khi không có chức năng vì bạn không có bất kỳ đóng cửa nào khác có thể vô tình nắm bắt 'i'. Đó có phải là mã chính xác của bạn không? –

+0

Như @MatthewFlaschen nói, mã này có vẻ ổn. Tuy nhiên, bạn có thể thử 'hàm (i) {......}) (i);' để không nghi ngờ gì 'i' bị bắt. –

+2

Tôi nghi ngờ bạn cần bao gồm nhiều ngữ cảnh hơn; lỗi này không xuất hiện ở đây – Kato

Trả lời

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

Nên hoạt động; tuy nhiên, bạn không bao giờ nên tạo một hàm trong vòng lặp. Do đó,

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

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

Không có gì sai khi tạo một hàm ẩn danh trong vòng lặp, miễn là phạm vi được thực hiện chính xác. –

+1

@MatthewFlaschen, Hoặc lấy sự phức tạp của phạm vi chính xác ra khỏi phương trình. – Joe

3

tôi sẽ khuyên bạn nên làm điều này trong một phong cách thêm chức năng: P

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

Hãy thử điều này

Các vấn đề liên quan