2017-01-04 4 views
0
function getStuff(serial){ 
    return new Promise(function (fulfill, reject){ 
     request("url using serial", function (error, response, body){ 
     try { 
      fulfill(body); 
     } catch (error) { 
      reject(error); 
     } 
     }, reject); 
    }); 
} 

while(FLAG) { 
    var p = getStuff(x); 
    p.then(function(obj){ 
    console.log(obj) 
    if(some condition on obj) FLAG = false 
    }) 
    //WAIT HERE TILL ITS DONE!!!! 
} 

Wie verwende ich dieses Versprechen, um nacheinander eine Reihe von Aufrufen mit verschiedenen Serien mit einer Schleife auszuführen?Wie führe ich http get in Knoten

+0

Werfen Sie einen Blick auf Versprechen: https://spring.io/understanding/javascript-promises alternativ könnten Sie die Async-Bibliothek verwenden: http://caolan.github.io/async/ – kkreft

+0

Können Sie ein Beispiel zeigen Versprechungen nutzen? Ich werde meinen Code auf die Arbeit, die ich getan habe, aktualisieren. – Javier

+0

aktualisiert den Code. Bitte sagen Sie mir, wie Sie dieses Versprechen verwenden können – Javier

Antwort

2

Mit Knoten müssen Sie Ihren Code für asynchrone Aufrufe strukturieren.

Der Kommentar von kkreft beschreibt einige Tools, mit denen Sie dabei helfen können.

Eine Implementierung des Codes, der wäre funktionieren könnte:

var x = 1 
var list = [] 
function trial(callback) { 

    http.get("endpoint url", function (err, response) { 
     x++; 
     list.append(response.data); 

     if (err) 
      callback(err); 
     else 
      callback(null, x); 
    }); 
} 

trial(function(err, r) { 
    console.log(r); 
    console.log(list); 
}); 
+0

Bitte überprüfen Sie meinen aktualisierten Code. Ich habe Probleme bei der Verwaltung von Versprechungen. – Javier

1

Die kurze Antwort ist, dass Sie nicht tun. Alles, was Sie mit den Daten tun möchten, die von einem Anruf zurückkommen, muss im Rückruf sein. Also:

var x = 1 
function trial() { 
    http.get("endpoint url", function (response) { 
    x++; 
    list.push(response.data); 
    console.log(x) // 2 
    }); 

    return x; 
} 
console.log(trial())// 1 

Der Anruf, den Sie versenden, ist asynchron. Im Moment gibt es nichts in der Spezifikation, das uns auf die Ergebnisse eines Anrufs warten lässt. Der gesamte synchrone Code (alles, was Sie außerhalb der Funktion haben) wird ausgeführt, bevor die Ergebnisse des Aufrufs zurückkommen, egal wie lange es dauert. Sie müssen also mit den Daten innerhalb des Callbacks oder etwas anderem umgehen, das Async wie Versprechen verwaltet.

+0

Bitte überprüfen Sie meinen aktualisierten Code. Ich habe Probleme bei der Verwaltung von Versprechungen. Ich verstehe die Konzepte, aber ich habe es in Code umwandeln. – Javier