Zunächst sollten Sie einen Blick auf request nehmen, die populärste Wahl Anfragen für HTTP ist aufgrund seiner Einfachheit.
Zweitens können wir die Einfachheit der Anfrage mit dem Konzept der Versprechen kombinieren, um mehrere Anfragen nacheinander zu machen, während der Code flach gehalten wird.
request-promise
var rp = require('request-promise')
var url1 = {}
var url2 = {}
var url3 = {}
rp(url1)
.then(response => {
// add stuff from url1 response to url2
return rp(url2)
})
.then(response => {
// add stuff from url2 response to url3
return rp(url3)
})
.then(response => {
// do stuff after all requests
// If something went wrong
// throw new Error('messed up')
})
.catch(err => console.log) // Don't forget to catch errors
Wie Sie sehen können, können wir so viele Anfragen hinzufügen, wie wir wollen, und der Code wird flach und einfach bleiben. Als Bonus konnten wir die Fehlerbehandlung hinzufügen. Bei herkömmlichen Callbacks müssten Sie jedem Callback eine Fehlerbehandlung hinzufügen, während Sie dies hier nur einmal am Ende der Promise-Kette tun müssen.
UPDATE (16.09): Während Promises uns nehmen halber Strecke hat weitere Erfahrung mich überzeugt, dass allein unordentlich Versprechen bekommen, wenn es eine Menge Mischen zwischen sync, async Code und insbesondere Fluss zu steuern (zB wenn -sonst). Der kanonische Weg, dies zu lösen, wäre mit async/await, jedoch ist das immer noch in der Entwicklung und würde eine Transpilation erfordern. Als solche sind generators die nächstbeste Lösung.
Mit co
var co = require('co')
var rp = require('request-promise')
var url1 = {}
var url2 = {}
var url3 = {}
co(function*() {
var response
response = yield rp(url1)
// add stuff from url1 response to url2
response = yield rp(url2)
// add stuff from url2 response to url3
response = yield rp(url3)
// do stuff after all requests
// If something went wrong
// throw new Error('messed up')
})
.catch(err => console.log) // Don't forget to catch errors
UPDATE (12/16): Nun, da die neueste Version des Knotens zum Zeitpunkt des Schreibens (7.2.1) unterstützt async/await hinter dem --harmony
Flagge, die Sie tun können dies:
const rp = require('request-promise')
const url1 = {}
const url2 = {}
const url3 = {}
async function doRequests() {
let response
response = await rp(url1)
// add stuff from url1 response to url2
response = await rp(url2)
// add stuff from url2 response to url3
response = await rp(url3)
// do stuff after all requests
// If something went wrong
// throw new Error('messed up')
}
doRequests()
.catch(err => console.log) // Don't forget to catch errors
Ungefähr die Antwort, die ich tippte. Sowohl die Verwendung von "Anfrage" als auch die Verwendung von Versprechen sind ausgezeichnete Vorschläge. –
Danke, aber ich bekomme Ausdruck Aussage ist keine Aufgabe oder Anruf. Gibt es eine andere Bibliothek, die ich neben der Anfrage hinzufügen muss? .then (response => { –
Hmm, du brauchst keine anderen Bibliotheken. Versuche in ES5 zu schreiben, deine Knoten-Version unterstützt möglicherweise nicht die fette Pfeilnotation. .then (function (response) {...}) –