2017-04-12 11 views
0

Phénomène étrange. socketiosocketio array.splice ne fonctionne pas si make console.log

SERVEUR

j'ai ce code ...

socket.on('disconnect', function(){ 

    console.log('user disconnected'); 

    for(var i=0; i<stores.length; i++){ 

     var c = stores[i]; 

     if(c.socketid == socket.id){ 

      stores.splice(i,1); 
      break; 
     } 
    } 

}); 

tout va bien avec le .splice. Si j'imprimer les magasins tableau d'ailleurs, il apparaît correct ... mais dans cette situation

socket.on('disconnect', function(){ 

      console.log('user disconnected'); 

      for(var i=0; i<stores.length; i++){ 

       var c = stores[i]; 

       if(c.socketid == socket.id){ 

        for(var i=0; i<stores.length;i++){ 

         console.log(i+" one"+stores[i].name+"-"+stores[i].id) 

        } 

        stores.splice(i,1); 

        for(var i=0; i<stores.length;i++){ 

         console.log(i+" two"+stores[i].name+"-"+stores[i].id) 

        } 

        break; 
       } 
      } 
    }); 

le tableau n'a pas perdu ses valeurs, je visite la page de mon navigateur (i connecté),

socket.on('storelogged', function (msg){ 

     var storeInfo = new Object(); 
     storeInfo.name  = msg.name; 
     storeInfo.id   = msg.id; 
     storeInfo.socketid  = socket.id; 
     stores.push(storeInfo); 

     console.log(msg.name + " has connected with " + msg.id + " id."); 

}); 

Ainsi, stocke poussé. Mais quand je suis déconnecté dans la deuxième situation de socket.on (« déconnexion », rappel) le tableau stocke contient toujours les valeurs (en d'autres termes, épissures ne fonctionnent pas)

commentaire pour donner, beaucoup plus et une meilleure information. Vous pouvez également le tester et voir les résultats

+0

Vos boucles intégrées 'for' a réécriture de la variable 'i' à partir de la boucle' for' de niveau supérieur. Utilisez 'let' au lieu de' var' comme dans 'for (let i = 0; ....)' pour toutes vos boucles 'for' ou utilisez un nom de variable différent pour les boucles' for' intégrées. – jfriend00

Répondre

1

Vos boucles for incorporées remplacent la variable i de la boucle for de niveau supérieur.

Soit utiliser let au lieu de var comme dans for (let i = 0; ....) pour toutes vos boucles for si chacun a une valeur différente portée a été définie localement i et les boucles internes ne remplaceront pas les boucles externes ou utiliser un autre nom de variable pour les boucles intégrées for ou utilisez .forEach() qui crée une nouvelle variable pour l'index.

En outre, après l'appel .splice() sur le tableau que vous itérez, vous avez décrémenter l'indice actuel du tableau de votre boucle for ou vous sautera regarder l'une des valeurs du tableau parce que le .splice() déplacé vers le bas dans la point d'index que vous venez de supprimer et que votre boucle for a déjà itéré.

Par exemple, vous pouvez modifier les noms variables des for internes des boucles comme ceci:

socket.on('disconnect', function() { 
    console.log('user disconnected'); 
    for (var i = 0; i < stores.length; i++) { 
     var c = stores[i]; 

     if (c.socketid == socket.id) { 
      for (var j = 0; j < stores.length; j++) { 
       console.log(j + " one" + stores[j].name + "-" + stores[j].id) 
      } 
      stores.splice(i, 1); 
      // make sure not to skip the value we just moved into the i slot in the array 
      i--;  
      for (var k = 0; i < stores.length; k++) { 
       console.log(k + " two" + stores[k].name + "-" + stores[k].id) 
      } 
      break; 
     } 
    } 
}); 

Ou, vous pouvez utiliser let pour les for boucles:

socket.on('disconnect', function() { 
    console.log('user disconnected'); 
    for (var i = 0; i < stores.length; i++) { 
     var c = stores[i]; 

     if (c.socketid == socket.id) { 
      for (let i = 0; i < stores.length; i++) { 
       console.log(i + " one" + stores[i].name + "-" + stores[i].id) 
      } 
      stores.splice(i, 1); 
      // make sure not to skip the value we just moved into the i slot in the array 
      i--; 
      for (let i = 0; i < stores.length; i++) { 
       console.log(i + " two" + stores[i].name + "-" + stores[i].id) 
      } 
      break; 
     } 
    } 
}); 

Ou, vous pouvez utiliser .forEach():

socket.on('disconnect', function() { 
    console.log('user disconnected'); 
    for (var i = 0; i < stores.length; i++) { 
     var c = stores[i]; 

     if (c.socketid == socket.id) { 
      stores.forEach(function(item, index) { 
       console.log(index + " one" + item.name + "-" + item.id) 
      }); 
      stores.splice(i, 1); 
      // make sure not to skip the value we just moved into the i slot in the array 
      i--; 
      stores.forEach(function(item, index) { 
       console.log(index + " one" + item.name + "-" + item.id) 
      }); 
      break; 
     } 
    } 
}); 
+0

ok je comprends. Ça fonctionne, merci. –