Skip to content

Instantly share code, notes, and snippets.

@bjouhier
Last active December 11, 2015 06:38
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bjouhier/4560643 to your computer and use it in GitHub Desktop.
Save bjouhier/4560643 to your computer and use it in GitHub Desktop.
// Wrapping asynchronous functions
// This wrapper is implemented with callbacks
// i is the index of the callback in the parameter list
// isFuture is a reserved parameter - do not pass it
function wrapper1(fn, i, isFuture) {
return function wrapped() {
var cb = arguments[i];
if (!isFuture) console.log("WRAPPER1 BEFORE CALL: " + fn.name);
if (cb == null) return wrapper1(fn.apply(this, arguments), 0, true);
arguments[i] = function(err, result) {
if (err) return cb(err);
console.log("WRAPPER1 AFTER CALL: " + result);
cb(null, result);
}
fn.apply(this, arguments);
}
}
// Wrapping asynchronous functions
// This wrapper is implemented as a streamline function
// It only works if the callback is the first arg.
function wrapper2(fn) {
return function(_) {
// remove _ from argument list
var args = Array.prototype.slice.call(arguments, 1);
console.log("WRAPPER2 BEFORE CALL: " + fn.name);
// invoke with apply_, callback index is 0
var ret = fn.apply_(_, this, args, 0);
console.log("WRAPPER2 AFTER CALL: " + ret);
return ret;
}
}
// Our asynchronous test function
function test(_, message) {
console.log("BEFORE TIMEOUT: " + message);
setTimeout(_, 1000);
console.log("AFTER TIMEOUT: " + message);
return "done";
}
// Testing the wrappers
try {
console.log("****************")
console.log("testing without wrapper");
var r = test(_, "hello");
console.log("r=" + r);
console.log("****************")
console.log("testing wrapper1");
var wrapped = wrapper1(test, 0);
var r = wrapped(_, "hello");
console.log("r=" + r);
console.log("****************")
console.log("testing wrapper2");
var wrapped = wrapper2(test, 0);
var r = wrapped(_, "hello");
console.log("r=" + r);
console.log("****************")
console.log("testing wrapper1 with future");
wrapped = wrapper1(test)
var f = wrapped(null, "hello");
var r = f(_);
console.log("r=" + r);
console.log("****************")
console.log("testing wrapper2 with future");
wrapped = wrapper2(test)
var f = wrapped(null, "hello");
var r = f(_);
console.log("r=" + r);
} catch (ex) {
console.log("EXCEPTION: " + ex);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment