Atribuindo valores a uma lista de variáveis ​​globais em JavaScript

Ei, agora estou usando o jQuery e tenho algumas variáveis ​​globais para armazenar um pouco de material ajax pré-carregado (pré-carregado para tornar as páginas fáceis e rápidas):


$.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 você pode ver, nós temos uma grande violação do princípio DRY, mas ... eu não vejo uma maneira de consertar ... alguma idéia?

talvez uma matriz?

1

6 Respostas

Usando o método jQuery each para iterar através de uma matriz de nomes de página e, em seguida, definindo uma variável global (no escopo da janela):

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
adicionado
Eu gosto do jQuery ... mas a resposta de Shog é a que realmente resolveu o meu problema:/Obrigado embora :)
adicionado o autor Jiaaro, fonte
Bom uso de jQuery.each ()!
adicionado o autor Shog9, fonte

Você não precisa de eval() ou Function() para isso. Uma matriz, como você suspeitava, fará bem o trabalho:

(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
adicionado

Você pode evitar o eval usando a nova função:

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;'));

Não é muito melhor que tbh

2
adicionado

A maioria dessas soluções propostas evita o uso de eval . Essa prática é ainda reforçada em " Convenções de código para a linguagem de programação JavaScript de Doduglas Crockford, que diz parte

"eval é mal

     

A função eval é a mais mal usada   recurso de JavaScript. Evite isso.

     

eval tem aliases. Não use o   Construtor de funções. "

0
adicionado

Você pode chamar apenas uma vez aquela página e retornar um objeto json em vez de um texto

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

e eval que Desde agora você está chamando N vezes o seu servidor, isso desacelera tudo, você deve reconsiderar sua lógica!

PS. enquanto eu escrevo eu vi a resposta do RoBorg, você vê, ao usar a nova função você está usando eval sob o capô, então se você quiser usá-lo ir para ele (em algum navegador é mais rápido também)

0
adicionado

Isso não usa eval, embora seja um pouco mais prolixo.

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

Mas um dos respondentes fez um bom ponto, você provavelmente deve tentar combinar todos esses pedidos em um caso contrário, seu servidor será atingido 6 vezes por conteúdo dinâmico em cada solicitação da página.

0
adicionado
JavaScript Brasil OFICIAL
JavaScript Brasil OFICIAL
4 138 dos participantes

Grupo sobre JavaScript do Brasil