2013-10-08 3 views
2


J'ai le morceau de code suivant qui devrait implémenter trois fonctions de rappel pour trois configurations de port d'un serveur TCP. La sortie de la console doit indiquer pour lequel des trois canaux elle est configurée, mais sans doute parce que l'expansion de la variable "i" est faite au moment du rappel et obtient donc la dernière valeur de i qui est 2.
Ma question: Comment puis-je faire en sorte que le noeud développe ma variable "i" lorsque le rappel est défini?

Merci d'avoir aidé à l'avance.expansion de variables dans les rappels node.js


var p_arr = [ 
    {src_port: 5500, src_host: "localhost", dst_port: 5501, dst_host: "localhost"}, 
    {src_port: 5502, src_host: "localhost", dst_port: 5503, dst_host: "localhost"}, 
    {src_port: 5504, src_host: "localhost", dst_port: 5505, dst_host: "localhost"}, 
]; 

for (var i in p_arr) { 
    try { 
     rcv_soc[i] = net.createServer(function (stream) { 
      if (verbose & 1) console.log("Listening on host %s, port %s...", p_arr[i].src_host, p_arr[i].src_port); 
      stream.on("data", function (data) { 
       if (verbose & 4) console.log("Received from app %d: %s", i, data); 
      }); 
     }); 

     rcv_soc[i].listen(p_arr[i].src_port, p_arr[i].src_host); 
    } 
    catch (err) { 
     console.log("No connection possible !!"); 
    } 
} 

Répondre

1

Wrap que dans une func auto-exécution avec i comme param:

for (var i in p_arr) (function(i) { 
try { 
    rcv_soc[i] = net.createServer(function (stream) { 
     if (verbose & 1) console.log("Listening on host %s, port %s...", p_arr[i].src_host, p_arr[i].src_port); 
     stream.on("data", function (data) { 
      if (verbose & 4) console.log("Received from app %d: %s", i, data); 
     }); 
    }); 

    rcv_soc[i].listen(p_arr[i].src_port, p_arr[i].src_host); 
} 
catch (err) { 
    console.log("No connection possible !!"); 
} 
})(i) 
0

Cela est dû à des règles de cadrage en Javascript.

La solution la plus simple consiste à utiliser forEach pour créer un nouveau champ d'application (fonction) pour chaque élément du tableau:

p_arr.forEach(function(entry, i) { 
    // 'entry' is the same as 'p_arr[i]' 
    ... 
}); 
Questions connexes