50 lines
767 B
JavaScript
50 lines
767 B
JavaScript
|
|
||
|
/**
|
||
|
* Module dependencies.
|
||
|
*/
|
||
|
|
||
|
var assert = require('assert');
|
||
|
|
||
|
/**
|
||
|
* Expose `thunkify()`.
|
||
|
*/
|
||
|
|
||
|
module.exports = thunkify;
|
||
|
|
||
|
/**
|
||
|
* Wrap a regular callback `fn` as a thunk.
|
||
|
*
|
||
|
* @param {Function} fn
|
||
|
* @return {Function}
|
||
|
* @api public
|
||
|
*/
|
||
|
|
||
|
function thunkify(fn){
|
||
|
assert('function' == typeof fn, 'function required');
|
||
|
|
||
|
return function(){
|
||
|
var args = new Array(arguments.length);
|
||
|
var ctx = this;
|
||
|
|
||
|
for(var i = 0; i < args.length; ++i) {
|
||
|
args[i] = arguments[i];
|
||
|
}
|
||
|
|
||
|
return function(done){
|
||
|
var called;
|
||
|
|
||
|
args.push(function(){
|
||
|
if (called) return;
|
||
|
called = true;
|
||
|
done.apply(null, arguments);
|
||
|
});
|
||
|
|
||
|
try {
|
||
|
fn.apply(ctx, args);
|
||
|
} catch (err) {
|
||
|
done(err);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|