Pregunta

Hola, en este momento estoy usando jQuery y tengo algunas variables globales para contener un poco de material ajax precargado (precargado para 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?

¿Fue útil?

Solución

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

(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<pages.length; ++i)
   {
      // "this" refers to the outer scope; likely the window object. 
      // And will result in page contents being stored in global variables 
      // with the same names as the pages being loaded. We use the with({})
      // construct to create a local scope for each callback with the
      // appropriate context and page name.
      with ({context: this, pageName: pages[i]})
         $.get("content.py?pageName=" + pageName, function(data)
            {context[pageName] = data;});
   }

})(); // close scope, execute anonymous function

// at this point, viewer, artists, etc. are populated with page contents 
// (assuming all requests completed successfully)

Otros consejos

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]"));
    }
);

Actualización: En realidad, ni siquiera necesita la " nueva función " ;:

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

Puede evitar evaluar usando 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

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

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

y evalúa eso Como ahora está llamando N veces a su servidor, esto ralentiza todo, ¡debería reconsiderar su lógica!

PS. mientras escribo, vi la respuesta de RoBorg, ya ves, cuando usas una nueva función, estás usando eval debajo del capó, así que si quieres usarlo, hazlo (en algunos navegadores también es más rápido)

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 que respondieron hizo un buen punto, probablemente debería intentar combinar todas estas solicitudes en una sola, de lo contrario, su servidor se verá afectado 6 veces por contenido dinámico en cada solicitud de la página.

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

  

" eval is Evil

     

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. & Quot;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top