Is there a better/more beautiful way to call multiple APIs after another (in serial) as in my example?
var request = require('request');
request('', function (error, response, body) {
if (!error && response.statusCode == 200) {
request('', function (error, response, body) {
if (!error && response.statusCode == 200) {
request('', function (error, response, body) {
if (!error && response.statusCode == 200) {
//And so on...
}
})
}
})
}
})
Is there a better/more beautiful way to call multiple APIs after another (in serial) as in my example?
var request = require('request');
request('http://www.test./api1', function (error, response, body) {
if (!error && response.statusCode == 200) {
request('http://www.test./api1', function (error, response, body) {
if (!error && response.statusCode == 200) {
request('http://www.test./api1', function (error, response, body) {
if (!error && response.statusCode == 200) {
//And so on...
}
})
}
})
}
})
Share
Improve this question
asked Feb 19, 2017 at 18:22
Tilman MarquartTilman Marquart
1151 gold badge1 silver badge9 bronze badges
1
- Write real case.. we will help you – Abdennour TOUMI Commented Feb 19, 2017 at 18:31
5 Answers
Reset to default 5Depending on which version of node you are using, promises should be native...
https://nodejs/en/blog/release/v4.0.0/
https://developer.mozilla/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
var request = require('request');
getRequest('http://www.test./api1').then(function (body1) {
// do something with body1
return getRequest('http://www.test./api2');
}).then(function (body2) {
// do something with body2
return getRequest('http://www.test./api3');
}).then(function (body3) {
// do something with body3
//And so on...
});
function getRequest(url) {
return new Promise(function (success, failure) {
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
success(body);
} else {
failure(error);
}
});
});
}
Use async.series
If you want to do same operation on a set of URLs, use async.map
Promise can also be used as others suggested.
If you are new with asynchronous programming, I suggest to start with async
module then move to Promise
(or coroutines
, async/await
) once you have clearer understanding.
Example:
var request = require('request');
async.series([
function(callback) {
request('http://www.test./api1', function(error, response, body) {
if (!error && response.statusCode == 200) {
return callback(null, response);
}
return callback(error || new Error('Response non-200'));
}
},
function(callback) {
request('http://www.test./api2', function(error, response, body) {
if (!error && response.statusCode == 200) {
return callback(null, response);
}
return callback(error || new Error('Response non-200'));
}
}
],
// optional callback
function(err, results) {
if (err) {
// Handle or return error
}
// results is now array of responses
});
You can use request-promise
instead of request
and then you would be able to chain all the promises!
https://github./request/request-promise
var rp = require('request-promise');
rp(options)
.then(function (body) {
return rp(...)
}).then(()){
...
}
In my honest opinion and if the order is not important you should do all the requests in parallel!
Use Promises.
https://www.promisejs
https://www.promisejs/patterns/
It is much better than callbacks and it can execute one request after another in serial.
You may want to consider using JavaScript Promises. They sure provide a more beautiful
way to handle callbacks.