Atribuiți valori unei liste de variabile globale în JavaScript

Acum, eu folosesc jQuery și am câteva variabile globale pentru a ține un pic de pre-încărcate ajax chestii (preîncărcate pentru a face paginile să vină frumos și rapid):


$.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;});

După cum vedeți, avem o încălcare enormă a principiului DRY, dar ... Nu văd într-adevăr o modalitate de ao repara ... orice idee?

poate o matrice?

1

6 răspunsuri

Folosind jQuery fiecare metodă pentru a itera printr-o serie de nume de pagini și apoi setarea unei variabile globale (în sfera ferestrei):

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
adăugat
Îmi place jQuery ... dar răspunsul lui Shog este cel care mi-a rezolvat problema:/Multumesc :)
adăugat autor Jiaaro, sursa
Folosește cu ușurință jQuery.each ()!
adăugat autor Shog9, sursa

Nu aveți nevoie de eval() sau Function() pentru aceasta. O serie, după cum ați bănuit, va face treaba bine:

(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
adăugat

Aveți posibilitatea să evitați eval folosind funcția nouă:

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

Nu este mult mai bine, deși tbh

2
adăugat

Majoritatea acestor soluții propuse evită utilizarea eval . Această practică este întărită în continuare în " Convenții de cod pentru limbajul de programare JavaScript al lui Doduglas Crockford, care spune în parte

"eval este rău

     

Funcția eval este cea mai folosită   caracteristică a JavaScript. Evitați acest lucru.

     

eval are aliasuri. Nu utilizați   Constructor de funcții. "

0
adăugat

Puteți să apelați doar o singură dată acea pagină și să returnați un obiect json în loc de text

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

și să evalueze asta Deoarece acum sunați N de ori serverul dvs., acest lucru încetinește toate, ar trebui să vă reconsiderați logica!

PS. așa cum am scris am văzut răspuns RoBorg, vedeți, atunci când utilizați noi funcții pe care le utilizați eval sub capota, deci dacă doriți să-l utilizați du-te pentru el (în unele browser-ul este mai rapid)

0
adăugat

Acest lucru nu utilizează eval, deși este puțin mai vag.

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

Dar unul dintre respondenți a făcut un punct bun, probabil că ar trebui să încercați să combinați toate aceste cereri într-un altfel serverul dvs. va fi lovit de 6 ori pentru conținutul dinamic al fiecărei solicitări a paginii.

0
adăugat
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com