2017-09-28 1 views
0

zu verketten Ich helfe mit einem Discord Bot und bin mit node.js. Ich muss Ergebnisse aus zwei separaten JSON-Feeds erhalten und Anfrage-Versprechen dafür verwenden.Einige Hilfe benötigt, um zwei Anfrage-Versprechen zusammen in node.js

tableRequest().then(function(val) { 
       console.log(val); 
      }).catch(function(err) { 
       console.err("Something went wrong"); 
      }); 

playersRequest().then(function(val) { 
       console.log(val); 
      }).catch(function(err) { 
       console.err("Something went wrong"); 
      }); 

Die Oberseite jeder Funktion sieht so aus.

function tableRequest(){ 
    return new Promise(function(resolve, reject){ 
     request('http://xxx.xxx.xxx.xxx/table', function (error, response, body) { 

Wenn ich meinen Code ausführen, werden beiden Sätze von Daten an die Konsole fein angemeldet, aber von dem, was ich gelesen habe, ist dies nicht wirklich richtig. Und wie benutze ich dann die beiden val woanders?

Das ist nicht meine Stärke. Ich bin ein Drupal-Typ. Danke, wenn du helfen kannst.

Antwort

2

Ich werde empfehlen Sie ES7 zu verwenden async/await:

Der Code wird dann zu:

async function myFunction() { 
    let val_1 = await tableRequest(); 
    let val_2 = await playersRequest() 
    return {val_1, val_2}; // This way you could use the values 
    // inside another function 
} 

Wenn Sie noch Versprechungen verwenden müssen, Sie bluebird library nutzen könnten. Mit drossel Versprechen, könnten Sie haben:

const Promise = require('bluebird'); 

Promise.coroutine(function*() { 
    let val_1 = yield tableRequest(); 
    let val_2 = yield playersRequest(); 
    // Now you could use the values 
}) 

Wenn Sie weder von async/await oder bluebird verwenden möchten, könnten Sie Kette wie folgt aus:

let val_1, val_2; 
tableRequest().then(val => { 
    val_1 = val; 
    // Do something and return 
    return foo; 
}) 
.then(foo => playersRequest()) 
.then(val => { 
    val_2 = val; 
}) 
.catch(e => console.log(e)) 
+0

Wow, ich so haben gesucht Viele antworten und waren so verwirrt .. Ich werde diese in ca. 30 Minuten probieren und hoffentlich etwas Erfolg haben. Es sieht gut aus. –

+0

@NiallMurphy Fügte auch die Verkettungslogik hinzu –

+1

Ich musste meine Version von Knoten aktualisieren, aber schließlich bekam die async/erwarten funktioniert perfekt mit Ihrem Code. Vielen Dank! –