2009-08-30 13 views
58
var list = []; 
$.getJSON("json.js", function(data) { 
    $.each(data, function(i, item) { 
     console.log(item.text); 
     list.push(item.text); 
    }); 
}); 
console.log(list.length); 

list.length siempre devuelve 0. He hojeado el JSON en firebug y está bien formado y todo se ve bien. Simplemente no puedo agregar un elemento a la matriz, ¿qué me estoy perdiendo?¿Cómo agrego elementos a una matriz en jQuery?

+0

Esto parece correcto. ¿El bucle '$ .each' imprime elementos en el registro, pero no los agrega a' list'? – Kobi

Respuesta

113

Dado que $.getJSON es asíncrono, creo que su código console.log(list.length); se está disparando antes de que se haya completado su matriz. Para corregir esto puso a su estado de console.log dentro de su devolución de llamada:

var list = new Array(); 
$.getJSON("json.js", function(data) { 
    $.each(data, function(i, item) { 
     console.log(item.text); 
     list.push(item.text); 
    }); 
    console.log(list.length); 
}); 
3

Usted está haciendo una petición Ajax, que es asíncrona, por lo tanto el registro de la consola de la longitud de la lista se produce antes de la solicitud Ajax ha completado.

La única forma de lograr lo que desea es cambiar la llamada ajax para que sea sincrónica. Puede hacerlo utilizando .ajax y pasando asynch: falso; sin embargo, esto no es recomendable, ya que bloquea la IU hasta que la llamada ha regresado; si no puede regresar, el usuario debe desconectarse del navegador.

2

Hope esto le ayudará a ..

var list = []; 
    $(document).ready(function() { 
     $('#test').click(function() { 
      var oRows = $('#MainContent_Table1 tr').length; 
      $('#MainContent_Table1 tr').each(function (index) { 
       list.push(this.cells[0].innerHTML); 
      }); 
     }); 
    }); 
Cuestiones relacionadas