- Published on
Parallel requests in node using promises
- Authors
- Name
- Peter Peerdeman
- @peterpeerdeman
While developing my first node applications I rediscovered the power of promises in javascript. In one recent project I built a proxy application that aggregates some data from different resources, bundles it and serves it in one single json to the frontend.
Using the q library for promises, the following snippet fetches multiple urls simultaneously and builds the response when all calls are finished.
var q = require('q');
var request = require('request');
exports.get = function (req, res) {
var promises = [
getUrl('http://example.com/api/feed'),
getUrl('http://differentexample.com/api/feed'),
];
q.allSettled(promises).then(function (results) {
var body = [];
results.forEach(function (result) {
if (result.state === 'fulfilled') {
//promise was resolved, push the data
var item = result.value;
body.push({
data: item.data,
statuscode: 200,
});
} else {
//promise was rejected, push the statuscode
body.push({
statuscode: result.reason.statusCode,
});
}
});
res.send(body);
});
};
function getUrl(url) {
var deferred = q.defer();
request.get(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
var result = JSON.parse(body);
deferred.resolve(result);
} else {
deferred.reject(response);
}
});
return deferred.promise;
}
The fun part of implementing promises is shown in the getUrl
method, where I demonstrate how to create a promise yourself using the q library. You can make any function asynchronous by first declaring the deferred object, doing some stuff that might take a while and then immediately returning the deferred's promise.