function cancellable(fn) { var cancelled = false; var wrapped = function() { if (!cancelled) { fn.apply(null, arguments) } }; wrapped.cancel = function() { cancelled = true; }; return wrapped; } var async = function (cb) { setTimeout(function () { cb(null); }, 1000); } var callback = cancellable(function () { console.log('yo, i called you back'); }); async(callback); // callback.cancel(); // ^ call me before the timeout and i won't run