2016-09-21 10 views
0

Ich verwende die Bluebird verspricht Bibliothek in Verbindung mit request-promise. Dies ist mein Code:Übergeben Antwortdaten in Headern und anderen Feldern in nachfolgenden Anforderungen

var Bluebird = require('bluebird'); 
var rp = require('request-promise'); 

var request1 = rp(paramsReq1); 
var request2 = rp(paramsReq2); 
var request3 = rp(paramsReq3); 

Bluebird.all([request1, request2, request3]) 
    .spread(function (responseOfReq1, responseOfReq2, responseOfReq3) { 
     // All requests succeeded. 
     // Process the responses now. 
    }) 
    .catch(function (err) { 
     // At least one request failed. 
     // Do your error handling here. 
    }); 

Dies funktioniert jedoch muss ich einige Inhalte von der ersten Anfrage (apikey) in einen Header in der zweiten Anforderung zurückzugeben. Dann muss ich einige Antwortdaten von der zweiten Anfrage in die dritte Anfrage übergeben.

Wie kann ich das am besten erreichen?

+0

Hat [meine post unten] (http://stackoverflow.com/questions/39627159/passing-response-data-into-headers-and-other-fields-in-subsequen-requests/39627301#39627301) beantwortet Frage? Wenn dies der Fall ist, können Sie [die Annahme der Antwort] in Betracht ziehen (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235), weil gerade andere Leute suchen Dieses Problem sehen, dass Ihre Frage keine gute Antwort und möglicherweise nicht lesen kann. Wenn es Ihre Frage nicht beantwortet hat, dann kommentieren Sie bitte, was fehlt. Ich gehe meine alten Antworten durch und möchte sicherstellen, dass sie gut sind. Vielen Dank. – rsp

Antwort

0

Wenn Sie Daten von Antwort 1 in Anforderung 2 und Daten von Antwort 2 in Anforderung 3 verwenden müssen, können Sie sie nicht alle parallel ausführen.

Sie haben so etwas zu tun:

rp(paramsReq1).then(function (responseOfReq1) { 
    // do something with responseOfReq1 ... 
    return rp(paramsReq2); 
}).then(function (responseOfReq2) { 
    // do something with responseOfReq2 ... 
    return rp(paramsReq3); 
}).then(function (responseOfReq3) { 
    // do something with responseOfReq3 ... 
}).catch(function (err) { 
    // At least one request failed. 
    // Do your error handling here. 
}); 

Mit anderen Worten: Sie Kette haben die Anrufe, denn wenn man responseOfReq1 vorbereiten müssen paramsReq2 dann können Sie nicht rp(paramsReq2) aufrufen, bevor das Versprechen zurück von rp(paramsReq1) bekommt aufgelöst.

Running:

var request1 = rp(paramsReq1); 
var request2 = rp(paramsReq2); 
var request3 = rp(paramsReq3); 

würde das nicht tun, was Sie brauchen, weil es sie parallel laufen würden und die nächsten Anfragen würden keinen Zugriff auf die vorherige Antwort haben - sie würden alle zur gleichen Zeit beginnen bevor einer von ihnen eine Chance bekommt, zu beenden. Egal, was Sie mit den zurückgegebenen Versprechen tun, die Anfragen würden bereits gestartet werden.

+0

Eigentlich muss ich sie in seriell ausführen. d. h. Kette sie zusammen – user1513388

+0

@ user1513388 Ja, und das habe ich erklärt. Funktioniert es für Sie? – rsp

Verwandte Themen