Zuweisen von Werten zu einer Liste globaler Variablen in JavaScript

Hey, im Moment benutze ich jQuery und ich habe einige globale Variablen, um ein bisschen vorinstallierte Ajax-Sachen zu haben (vorinstalliert, um Seiten schnell und schön zu machen):


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

Wie Sie sehen können, haben wir eine große Verletzung des DRY-Prinzips, aber ... ich sehe nicht wirklich einen Weg, es zu reparieren ... irgendwelche Ideen?

vielleicht ein Array?

1

6 Antworten

Verwenden Sie jQuery für jede Methode, um ein Array von Seitennamen zu durchlaufen und anschließend eine globale Variable (im Fensterbereich) festzulegen:

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
hinzugefügt
Ich mag die jQuery ... aber Shogs Antwort ist diejenige, die mein Problem tatsächlich gelöst hat:/Danke, obwohl :)
hinzugefügt der Autor Jiaaro, Quelle
Nette Verwendung von jQuery.each ()!
hinzugefügt der Autor Shog9, Quelle

Sie benötigen dazu nicht eval() oder Function() . Ein Array, wie Sie vermutet haben, wird die Arbeit gut machen:

(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
hinzugefügt

Sie können eval vermeiden, indem Sie eine neue Funktion verwenden:

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

Es ist nicht viel besser, aber tbh

2
hinzugefügt

Die meisten dieser vorgeschlagenen Lösungen vermeiden die Verwendung von eval . Diese Praxis wird in Doduglas Crockfords " Code-Konventionen für die JavaScript-Programmiersprache weiter verstärkt Teil

"eval ist das Böse

     

Die Eval-Funktion wird am meisten missbraucht   Eigenschaft von JavaScript. Vermeiden Sie es.

     

eval hat Aliase. Benutze nicht die   Funktionskonstruktor. "

0
hinzugefügt

Sie können nur einmal diese Seite aufrufen und ein JSON-Objekt anstelle von Text zurückgeben

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

und prüfe das Da du jetzt N mal deinen Server anrufst, verlangsamt sich das alles, du solltest deine Logik überdenken!

PS. Während ich schreibe sah ich die RoBorg Antwort, sehen Sie, wenn Sie neue Funktion verwenden, verwenden Sie eval unter der Haube, also wenn Sie es verwenden wollen, gehen Sie dafür (in einigen Browsern ist auch schneller)

0
hinzugefügt

Dies verwendet eval nicht, obwohl es ein bisschen wortreicher ist.

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

Aber einer der Antworter hat einen guten Punkt gemacht, Sie sollten wahrscheinlich versuchen, alle diese Anfragen in einen zu kombinieren, ansonsten wird Ihr Server 6 mal für dynamischen Inhalt bei jeder Anfrage der Seite getroffen.

0
hinzugefügt
JavaScript - Deutsche Gemeinschaft
JavaScript - Deutsche Gemeinschaft
3 der Teilnehmer

In dieser Gruppe sprechen wir über JavaScript.