Last active
December 11, 2015 06:38
-
-
Save bjouhier/4560643 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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