traverson
Version:
Hypermedia API/HATEOAS client for Node.js and the browser
45 lines (40 loc) • 1.28 kB
JavaScript
/* jshint loopfunc: true */
;
var minilog = require('minilog')
, log = minilog('traverson');
var nextTickAvailable = process &&
Object.hasOwnProperty.call(process, 'nextTick');
/*
* Applies async and sync transforms, one after another.
*/
function applyTransforms(transforms, t, callback) {
log.debug('applying', transforms.length, 'transforms');
for (var i = 0; i < transforms.length; i++) {
var transform = transforms[i];
log.debug('next transform', transform);
if (transform.isAsync) {
// asynchronous case
return transform(t, function(t) {
// this is only called when the async transform was successful,
// otherwise t.callback has already been called with an error.
applyTransforms(transforms.slice(i + 1), t, callback);
});
} else {
// synchronous case
var result = transform(t);
if (!result) {
log.debug('transform has failed or was a final transform');
// stop processing t.callback has already been called
return;
}
}
}
log.debug('all transformations done, starting next step');
if (nextTickAvailable) {
return process.nextTick(function() {
callback(t);
});
}
return callback(t);
}
module.exports = applyTransforms;