In primo luogo, ti consigliamo di dare un'occhiata a request, che è la scelta più popolare per le richieste HTTP, grazie alla sua semplicità.
In secondo luogo, possiamo combinare la semplicità della richiesta con il concetto di Promises, per rendere più richieste in successione, mantenendo il codice piatto.
Utilizzando 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
Come si può vedere, si può aggiungere il maggior numero di richieste come vogliamo, e il codice rimarrà piatta e semplice. Come bonus, siamo stati in grado di aggiungere anche la gestione degli errori. Usando i callback tradizionali, dovresti aggiungere la gestione degli errori ad ogni callback, mentre qui dobbiamo farlo solo una volta alla fine della catena Promise.
UPDATE (16/09): Mentre promesse ci portano a metà strada, ulteriormente l'esperienza mi ha convinto che promette solo ottenere disordinato quando c'è un sacco di miscelazione tra sincronizzazione, il codice asincrono, e soprattutto controllare il flusso (ad esempio, se -altro). Il modo canonico per risolvere questo sarebbe con async/await, tuttavia che è ancora in fase di sviluppo e richiederebbe la transpilation. Come tale, generators sono la prossima soluzione migliore.
Utilizzando 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): Ora che l'ultima versione del nodo al momento della scrittura (7.2.1) supporta async/await dietro la bandiera --harmony
, si potrebbe fare this:
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
Circa la risposta che stavo scrivendo. Sia l'uso di 'richiesta' che l'utilizzo di Promises sono ottimi suggerimenti. –
Grazie, ma sto ottenendo dichiarazione di espressione non è un compito o una chiamata. C'è un'altra libreria che ho bisogno di aggiungere oltre alla richiesta-promettente? .then (response => { –
Hmm, non hai bisogno di altre librerie. Prova a scrivere in ES5, la versione del tuo nodo potrebbe non supportare la notazione della freccia grassa. .then (function (response) {...}) –