2017-09-01 1 views
0

Ich benutze Anfrage-Bibliothek, um mit anderen Servern über API zu kommunizieren. Aber jetzt muss ich mehrere (10 oder mehr) POST-Anfragen zur gleichen Zeit senden und nur weitergehen, wenn alle Antworten korrekt sind. Normalerweise sieht Syntax etwas wie folgt aus:Node.js Anfrage - Behandlung mehrerer POST-Anfragen

var options = { 
url: "", 
method: "POST", 
header: {...}, 
body: {...} 
}; 

request(options, function(err,response,body) 
{ 
} 

Aber jetzt habe ich eine Reihe von Objekten statt einer einzigen Optionen Variable bekam. Gibt es eine Möglichkeit, dies zu tun? Oder vielleicht gibt es eine andere Bibliothek, die das Problem lösen kann.

EDIT:

var arrayOfIds = []; 
const requests = []; 
for(var i in range){ 
    var options = {} // here goes all bodies and headers to send 
    requests.push(// push a request to array dynamically 
    request(options, function(err,response,body){ 
    if(!err && response.statusCode == 201){ 
     arrayOfIds.push(body.id); 
    } 
    })); 

Promise.all(requests) 
.then(function(res){ 
    console.log(arrayOfIds); // this is empty 
}); 
+0

Mögliches Duplikat [Schleife durch asynchrone Anforderung] (https://stackoverflow.com/questions/44636542/loop-through-asynchronous-request) –

Antwort

1

Es gibt mehrere Ansätze, diese zu lösen:

  • Asynchron-Bibliothek, Verfahren parallel
  • Promise.all

Um Ihre Anfrage zu Versprechen zu wechseln , verwenden Sie zusätzlich request Modul - request-promise . Im Code wird wie folgt aussehen:

const request = require('request-promise'); 

// Note, you don't assign callback here 
const promises = [ 
    request.post({...}), 
    request.post({...}), 
    request.post({...}) 
]; 

// And then you simply do Promise.all 
Promise.all(promises).then(console.log); 
+0

Dank. Das ist sehr hilfreich. Und was, wenn ich die genaue anzahl der anfrage nicht kenne? Sollte ich eine regelmäßige Schleife verwenden, um const Versprechungen Array zu erfüllen? – Jacek717

+0

Füllen Sie sie nur dynamisch, es ist kein Problem. – Lazyexpert

+0

Eine letzte Frage: alle diese Anfragen sollten mir eine IDs von Objekten zurücksenden, die ich gerade remotely auf einem anderen Server erstellt habe. Ich habe ein Array von IDs erstellt und versucht, es zu füllen, indem ich einen body.id-Wert erhalte, wenn alles korrekt ist. Allerdings funktioniert es nicht und nach Promise.all bekomme ich nur ein leeres Array. Weißt du, wie man es repariert? Ich habe meinen ursprünglichen Code bearbeitet, um Ihnen alles zu zeigen – Jacek717