Asignación de valores a una lista de variables globales en JavaScript

Hola, ahora estoy usando jQuery y tengo algunas variables globales para contener un poco de ajax precargado (precargado para hacer que las páginas salgan bien y rápido):


$.get("content.py?pageName=viewer", function(data)
    {viewer = data;});
$.get("content.py?pageName=artists", function(data)
    {artists = data;});
$.get("content.py?pageName=instores", function(data)
    {instores = data;});
$.get("content.py?pageName=specs", function(data)
    {specs = data;});
$.get("content.py?pageName=about", function(data)
    {about = data;});

Como puede ver, tenemos una gran violación del principio DRY, pero ... realmente no veo una manera de solucionarlo ... ¿Alguna idea?

tal vez una matriz?

1

6 Respuestas

Usando jQuery cada método para iterar a través de una matriz de nombres de página y luego establecer una variable global (en el alcance de la ventana):

jQuery.each(
    ["viewer", "artists", "instores", "specs", "about"],
    function (page) {
        $.get("content.py?pageName=" + page,
            new Function("window[" + page + "] = arguments[0]"));
    }
);

Update: Actually, you don't even need the "new Function":

jQuery.each(
    ["viewer", "artists", "instores", "specs", "about"],
    function (page) {
        $.get("content.py?pageName=" + page, function() { window[page] = arguments[0]; });
    }
);
6
agregado
Me gusta el jQuery ... pero la respuesta de Shog es la que realmente resolvió mi problema:/Gracias :)
agregado el autor Jiaaro, fuente
Buen uso de jQuery.each ()!
agregado el autor Shog9, fuente

No necesita eval() o Function() para esto. Una matriz, como sospechabas, hará el trabajo muy bien:

(function()//keep outer scope clean
{
  //pages to load. Each name is used both for the request and the name
  //of the property to store the result in (so keep them valid identifiers
  //unless you want to use window['my funky page'] to retrieve them)
   var pages = ['viewer', 'artists', 'instores', 'specs', 'about'];

   for (var i=0; i
5
agregado

Puede evitar eval utilizando la nueva función:

var names = ['viewer', 'artists', 'instores', 'specs', 'about'];
for (var i = 0; i < names.length; i++)
   $.get("content.py?pageName=" + names[i], new Function('data', names[i] + ' = data;'));

No es mucho mejor aunque tbh

2
agregado

La mayoría de estas soluciones propuestas evitan el uso de eval . Esa práctica se refuerza aún más en " Convenciones de código para el lenguaje de programación de JavaScript de Doduglas Crockford, que dice en parte

"eval es malvado"

     

La función eval es la más mal utilizada   característica de JavaScript. Evítalo.

     

eval tiene alias. No use el   Constructor de funciones. "

0
agregado

Puede llamar solo una vez a esa página y devolver un objeto json en lugar de un texto

{
viewer:'me',
artists:'you',
instores:'instores',
specs:'specs',
about:'about'
}

y evaluar eso Como ahora llamas a N veces tu servidor, esto ralentiza todo, ¡deberías reconsiderar tu lógica!

PD. mientras escribo vi la respuesta de RoBorg, cuando usa la nueva función está utilizando eval debajo del capó, por lo que si desea usarlo, vaya para ello (en algunos buscadores también es más rápido)

0
agregado

Esto no usa eval, aunque es un poco más prolijo.

function get_content(name){
   $.get("content.py?pageName=" + name, function(data){ window[name] = data;});
}

var names = ['viewer', 'artists', 'instores', 'specs', 'about'];
for (var i = 0; i < names.length; i++)
    get_content(names[i]);

Pero uno de los contestadores hizo una buena observación, probablemente debería intentar combinar todas estas solicitudes en una, de lo contrario su servidor recibirá 6 veces el contenido dinámico en cada solicitud de la página.

0
agregado
JavaScript - Comunidad española
JavaScript - Comunidad española
4 de los participantes

En este grupo hablamos de JavaScript. Partner: es.switch-case.com