2017-05-30 2 views
-3

Wie kann ich die unten makeHttpRequest 7 mal mit einer Verzögerung von 1 Sekunde zwischen jedem Anruf Schleife? - Ich habe versucht setTimeout und Verzögerung, aber kann nicht scheinen, die richtige Art der Verwendung von ihnen auszuarbeiten.Schleifen mit Verzögerung in Knoten JS

var post_data = that.createIRRC("AAAAAQAAAAEAAAB1Aw=="); 
that.makeHttpRequest(onError, onSucces, "", post_data, false) 
+0

Zeigen Sie uns den Versuch mit dem 'setTimeout', bitte – Bergi

Antwort

0

Wenn Sie eine Sekunde anhalten wollen, nachdem der HTTP-Anforderung abgeschlossen ist, bevor die nächste starten, dann können Sie setTimeout() im Abschluss Rückruf verwenden.

Und da sieht es jetzt wie Sie eine Folge von Codes senden möchten, können Sie in der Reihenfolge der Codes übergeben Sie in einem Array gesendet werden soll und diese that.createIRRC() für jeden folgenden Code aufrufen wird:

function sendSequence(cntr, data, delay) { 
    // create post_data for next code to send in the sequence 
    let post_data = that.createIRRC(data[cntr]); 
    that.makeHttpRequest(onError, function() { 
     // if we haven't done this limit times yet, then set a timer and 
     // run it again after one second 
     if (++cntr < data.length) { 
      setTimeout(function() { 
       sendSequence(cntr, data, delay); 
      }, delay); 
     } else { 
      onSuccess(); 
     } 
    }, "", post_data,false); 
} 

// define the codes 
// this should probably be done once at a higher level where you can define 
// all the codes you might want to send so you can reference them by a meaningful 
// name rather than an obscure string 
let codes = { 
    right: "AAAAAQAAAAEAAAAzAw==", 
    down: "AAAAAQAAAAEAAABlAw==", 
    select: "AAAAAQAAAAEAAABlAw==", 
    options: "AAAAAgAAAJcAAAA2Aw==", 
    hdmi2: "AAAAAgAAABoAAABbAw==", 
    hdmi3: "AAAAAgAAABoAAABcAw==" 
} 

// create sequence of codes to be sent 
let dataSequence = [ 
    codes.hdmi2, codes.options, 
    codes.down, codes.down, codes.down, codes.down, codes.down, codes.down, codes.down, 
    codes.right, 
    codes.down, codes.down, codes.down, codes.down, 
    codes.select, codes.hdmi3 
]; 
// start the process with initial cnt of 0 and 
// send the sequence of data to be sent and 
// with a one second delay between commands 
sendSequence(0, dataSequence, 1000); 
+0

Beachten Sie, dass hier 'onError' und' onSuccess' mehrfach aufgerufen werden – arboreal84

+0

@ arboreal84 - Nein, 'onError' würde nur einmal aufgerufen werden. Die Schleife stoppt, nachdem onError aufgerufen wurde - dies wurde absichtlich so geplant. 'onSuccess' würde mehrere Male aufgerufen werden, da dies anscheinend das ist, was das OP wünscht, andernfalls hätte das OP keine Möglichkeit, auf die Antwort von jedem Anruf zuzugreifen. – jfriend00

+0

Wo setze ich die createIRRC-Zeile ein? - Ich habe sowohl diesen Code als auch den von @ arboreal84 ausprobiert und kann auch nicht zur Arbeit kommen :(- Ich versuche eine Sequenz von Codes zu senden (Option/Down x 6/Rechts/Down/Select/HDMI3) an einen Fernseher, um eine bestimmte Funktion zu wählen (kein diskreter Code verfügbar). Wenn ich mehrere "that.makeHttpRequest (onError, onSucces," ", post_data, false);" Zeilen es funktioniert * manchmal *, andere wird es verwirrt. – Jason

0
var times = 0; 

var ivl = setInterval(function() { 
    var post_data = that.createIRRC("AAAAAQAAAAEAAAB1Aw=="); 
    that.makeHttpRequest(onError, onSucces, "", post_data, false) 

    if (++times === 7) { 
     clearInterval(ivl); 
    } 
}, 1000); 
+0

@Jason - Hinweis, diese Antwort startet jede Sekunde eine neue Anfrage. Es wartet nicht eine Sekunde nach dem Abschluss der vorherigen Anfrage (es hängt also davon ab, ob Sie genau das wollten oder nicht) - wenn eine Antwort langsam wird, könnten Sie hier mehrere Anfragen gleichzeitig starten und die Antworten könnten sogar außer Kontrolle geraten obwohl das unwahrscheinlich ist). Es bricht auch nicht ab, wenn es einen Fehler gibt, es geht einfach weiter. – jfriend00

+0

Ich habe bereits eine Antwort darauf gegeben. – jfriend00