2010-11-07 20 views
25


Quiero cargar un archivo JSON de mi propio servidor que contiene una matriz en una variable de objeto JavaScript.
Me gustaría hacerlo al comienzo de la carga de la página de forma sincrónica porque los datos son necesarios durante la carga de la página.¿Cómo incluir datos JSON en JavaScript de forma sincrónica sin analizar?

Logré usar jQuery.getJSON pero esto es asynch ajax y parece un poco exagerado.

¿Hay alguna manera de cargar JSON de forma sincronizada sin realizar su propio análisis?
(más o menos como usar un <script language="JavaScript" src="MyArray.json"></script>)

Gracias de antemano por cualquier ayuda, espero que tenga sentido ya que soy un novato de JavaScript. Paolo

+1

Depende del servidor. No veo ningún problema al hacer algo como var json = <% = jsonString%> – mplungjan

+1

¿Por qué quieres una solicitud sincrónica? – Gumbo

+1

Creo que quiero que sea sincrónico porque quiero esperar a que mi variable se inicialice con el contenido json antes de usarlo en las siguientes declaraciones (eso no tiene sentido sin esos datos json). – Paull

Respuesta

33

getJSON() es simplemente la abreviatura de la función ajax() con el conjunto dataType:'json'. La función ajax() le permitirá personalizar mucho sobre la solicitud.

$.ajax({ 
    url: 'MyArray.json', 
    async: false, 
    dataType: 'json', 
    success: function (response) { 
    // do stuff with response. 
    } 
}); 

todavía utiliza una devolución de llamada con async:false pero dispara antes de que la ejecución continúa desde la llamada AJAX.

+2

Creo async: false está en desuso ya que al menos jquery v1.11. Aquí está el mensaje que recibo en la consola: XMLHttpRequest sincrónico en el hilo principal está en desuso debido a sus efectos perjudiciales para la experiencia del usuario final. Para obtener más ayuda, consulte http://xhr.spec.whatwg.org/. –

+0

Tal vez está en desuso, ¿cuál es la alternativa? – bgmCoder

3

si estás usando un script del servidor de algún tipo, podría imprimir los datos de una etiqueta de script en la página:

<script type="text/javascript"> 
var settings = <?php echo $json; ?>; 
</script>

Esto le permitirá utilizar sus datos de forma sincrónica en lugar de tratar para usar AJAX asincrónicamente

De lo contrario, tendrá que esperar la devolución de llamada AJAX antes de continuar con lo que sea que esté haciendo.

+0

Sí, así. – mplungjan

+0

Estoy editando páginas de wordpress, mejor uso ajax, creo ... – Paull

+0

no si lo estás haciendo sincronizado. – VeXii

12

Aquí van:

// Load JSON text from server hosted file and return JSON parsed object 
function loadJSON(filePath) { 
    // Load json file; 
    var json = loadTextFileAjaxSync(filePath, "application/json"); 
    // Parse json 
    return JSON.parse(json); 
} 

// Load text with Ajax synchronously: takes path to file and optional MIME type 
function loadTextFileAjaxSync(filePath, mimeType) 
{ 
    var xmlhttp=new XMLHttpRequest(); 
    xmlhttp.open("GET",filePath,false); 
    if (mimeType != null) { 
    if (xmlhttp.overrideMimeType) { 
     xmlhttp.overrideMimeType(mimeType); 
    } 
    } 
    xmlhttp.send(); 
    if (xmlhttp.status==200) 
    { 
    return xmlhttp.responseText; 
    } 
    else { 
    // TODO Throw exception 
    return null; 
    } 
} 

NOTA: Este código funciona en los navegadores modernos única - IE8, FF, Chrome, Opera, Safari. Para las versiones IE obosolete debe usar ActiveX, hágamelo saber si quiere que le diga cómo;)

+0

Para solicitudes sincrónicas, el estado 200 nunca funciona. Siempre hay una excepción lanzada. – vsingh

+0

Esto no es cierto, utilizo este código y siempre funciona bien. –

+0

Las solicitudes ajax síncronas ya no funcionarán –

1

Solo necesitaba leer un pequeño archivo de entrada proporcionado en formato json y extraer una pequeña cantidad de datos. Esto funcionó muy bien en las circunstancias:

archivo JSON es en el mismo directorio que el script y se llama data.json, se ve algo como esto:

{"outlets":[ 
     { 
      "name":"John Smith", 
      "address":"some street, some town", 
      "type":"restaurant" 
     }, 
..etc... 

leer los datos en js como este:

var data = <?php echo require_once('data.json'); ?>; 

acceso a los elementos de datos como este:

for (var i in data.outlets) {  
var name = data.outlets[i].name; 
... do some other stuff... 
} 
+1

Esto es exactamente lo que estoy buscando hacer. Así que no hay una manera en que pueda incluir el JSON como un recurso de página () y luego leer de él? Tengo que hacer una declaración en el archivo incluido? Eso se siente como una forma muy sucia de hacerlo – 2bigpigs

0

Si RequireJS es una opción, puede hacerlo una dependencia utilizando requirejs. Lo uso para simular datos en mi aplicación angular. Es esencial que algunos de los datos falsos estén allí antes del arranque de la aplicación.

//Inside file my/shirt.js: 
define({ 
    color: "black", 
    size: "unisize" 
}); 

Simplemente ajuste los datos json en un definir y declararlo como una dependencia. Más información aquí: http://requirejs.org/docs/api.html#defsimple

0

AFAIK jQuery ha desaprobado las solicitudes XHR sincrónicas debido a la posibilidad de problemas de rendimiento. Puede intentar ajustar el código de la aplicación en el controlador de respuesta XHR de la siguiente manera:

$(document).ready(function() { 
    $.get('/path/to/json/resource', function(response) { 
    //'response' now contains your data 
    //your app code goes here 
    //... 
    }); 
}); 
Cuestiones relacionadas