2016-10-18 3 views
0

Ich bin mir nicht sicher, ob das, was ich versuche, möglich ist, oder ob es einen einfacheren Weg gibt, das zu tun, was ich versuche.JavaScript-Variable von außerhalb der Funktion ersetzen

Ich habe den folgenden Code:

<script> 
function TitleSwitch() { 
    var counter = 0, 
     fn = function() { 
      var array = ['Value1','Value2','Value3']; 
      $(document).prop('title', array[counter]); 
      counter++; 
      counter %= array.length; 
     }; 
     fn(); 
    return fn; 
} 
setInterval(TitleSwitch(), 5000); 
</script> 

Er dreht den Seitentitel zwischen den drei Variablen, Wert1, Wert2 und Wert3 alle 5 Sekunden. Das funktioniert gut.

Allerdings gibt es auf der gleichen Seite einige Ajax-Skripte, die nach anderen Informationen bezüglich der App fragen.

Ich versuche, einige der Daten aus dem Abruf-Skript verwenden, um die Werte in der Titelwechselfunktion zu ändern.

Als Beispiel können die Abfragedaten stattdessen Value4, Value5 und Value6 zurückgeben.

So in dem obigen Code, gibt es eine Möglichkeit, die Werte in

var array = ['Value1','Value2','Value3']; 

von einer anderen Funktion, außerhalb des Titels Umschaltfunktion zu ersetzen?

Also habe ich eine Funktion namens pollingDone(), die jedes Mal aufgerufen wird, wenn die Abrufdaten zurückgegeben werden, wie kann ich die Werte von "Array" in TitleSwitch() von pollingDone() nach TitleSwitch() ändern läuft schon mit setInterval?

Im Grunde wollte ich TitleSwitch laufen lassen, aber nur die verwendeten Werte ersetzen.

Der Grund, warum ich es auf diese Weise versuchte, ist, weil die Titel alle 5 Sekunden zwischen den drei Werten umgeschaltet werden, das Abfrageskript jedoch alle 10 Sekunden ausgeführt wird. Wenn ich also die TitleSwitch() - Funktion bei jedem Abschluss des Abruf-Skripts gestartet habe, wird der dritte Wert niemals im Titel angezeigt. Die ersten beiden würden zeigen, das Polling-Skript würde laufen, und dann würden die Titel von vorn beginnen. Also habe ich gehofft, die TitleSwitch() -Funktion so zu lassen, wie sie ist, und einfach die Werte zu ersetzen, die sie benutzt.

+0

Ich habe auch meine Frage ein wenig aktualisiert, um zu erklären, warum ich versuche, die Dinge so zu machen. –

Antwort

4

Sie können das tun, indem Sie die array Funktion in der fn Funktion dem äußeren Kontext aussetzen. Hier

ein Beispiel:

function TitleSwitch() { 
 
     var counter = 0; 
 
     this.array = ['Value1','Value2','Value3']; 
 
     var self = this; 
 
     this.fn = function() { 
 
      $(document).prop('title', self.array[counter]); 
 
      console.log(self.array[counter]); 
 
      counter++; 
 
      counter %= self.array.length; 
 
     }; 
 
     this.fn(); 
 
    } 
 
    var switcher = new TitleSwitch() 
 
    setInterval(switcher.fn, 500); 
 

 
    function asyncFn(){ 
 
     switcher.array[0] = "changed title1"; 
 
    } 
 

 
    setTimeout(asyncFn, 1000)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

@Amadan Danke für den Vorschlag, ich habe das nicht berücksichtigt. – Titus

+0

Ich bekomme: ReferenceError: Fn ist nicht definiert –

+0

http://jsbin.com/gohaheqabo/edit?html,js,output (mit ein paar Fixes). EDIT: oder das :) Aber beachte meinen Vorschlag zur Position von '% =' ... – Amadan

1

Übergeben Sie es im Konstruktor, damit Sie die Zugriffsebene von außen steuern können.

Im Beispiel:

  • myArray außerhalb des Verschlusses definiert, die TitleSwitch schafft.
  • Beim Bearbeiten der Werte verwendet die nächste Iteration die aktualisierten Inhalte.

Wie so:

function TitleSwitch(array) { 
 
    var counter = -1, 
 
     fn = function() { 
 
      counter++; 
 
      counter %= array.length; 
 
      // Move to bottom to prevent errors when using a shorter array 
 
      console.log(array[counter]); 
 
     }; 
 
     fn(); 
 
    return fn; 
 
} 
 

 
var myArray = ['Value1','Value2','Value3']; 
 

 
setInterval(TitleSwitch(myArray), 1000); 
 

 
myArray[1] = "TEST"; 
 
myArray[2] = "TEST2";

+0

Dies wird das Ziel von OP nicht erfüllen - er möchte das Objekt nur einmal konstruieren, aber später den Wert ändern. Denken Sie mehr Setter als Konstruktor. Ihr Weg funktioniert zum Ändern einzelner Elemente, aber nicht zum Zuweisen eines neuen Arrays. – Amadan

+0

@Amadan, ich verstehe nicht wirklich, was du meinst ... Durch die Übergabe von 'myArray' an den äußeren' TitleSwitch' wird auf den Abschluss verwiesen, auf den 'fn' Zugriff hat, der an' setInterval' zurückgegeben wird . Sie konstruieren die Funktion einmal, und Sie konstruieren das Array einmal. – user3297291

+0

Fair genug. Ich dachte an den Fall, den OP beschreibt: 'array = ['Value4', 'Value5', 'Value6']' kann man nicht machen (aber ich denke, man kann es mit 'array.splice (0, array.length, ['Value4', 'Value5', 'Value6']) '...) – Amadan

0

Es gibt keine Möglichkeit array zu ersetzen, die als lokale Variable innerhalb fn definiert ist. Wenn Sie es außerhalb von TitleSwitch herausziehen, können Sie ihm einen neuen Wert geben. Alternativ können Sie eine Eigenschaft unter fn verwenden oder ein komplexeres Objekt erstellen, um die Umwelt nicht zu belasten.

Sie möchten auch die Modulolinie an den Anfang von fn erhöhen: z. Wenn Sie eine 5-Elemente-Liste mit counter haben, die 4 ist, und Sie array durch eine 2-Element-Liste ersetzen, würde Ihr Code brechen.

1

Ich glaube, Sie müssen Ihre Variable aus Ihrem Funktionsumfang, etwa so:

var titles = ['Value1', 'Value2', 'Value3']; 

function TitleSwitch() { 
    var counter = 0, 
     fn = function() { 
      $(document).prop('title', titles[counter]); 
      counter++; 
      counter %= titles.length; 
     }; 
     fn(); 
    return fn; 
} 
setInterval(TitleSwitch(), 5000); 

// Here, you can modify your titles in an ajax call 
0

var array = ['Value1','Value2','Value3']; 
 
function TitleSwitch() { 
 
    var counter = 0, 
 
     fn = function() { 
 
      
 
      $(document).prop('title', array[counter]); 
 
      console.log(array[counter]); 
 
      counter++; 
 
      counter %= array.length; 
 
     }; 
 
     fn(); 
 
    return fn; 
 
} 
 
setInterval(TitleSwitch(), 5000); 
 

 
function pollingDoneCallback(data){ 
 
if(data){ 
 
    array=[]; 
 
    for(var i=0;i<data.length;i++) 
 
    array.push(data[i]); 
 
} 
 
} 
 
pollingDoneCallback(['val5','val6']);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

Würde dies die bereits im Array vorhandenen Werte ersetzen oder einfach hinzufügen? Ich müsste sie ersetzen. –

+0

@Sherwin Flight haben es geändert, um das Array leer zu leeren, wenn neue Daten erhalten werden – nivendha

Verwandte Themen