| var defer = require('./defer.js'); | 
|   | 
| // API | 
| module.exports = async; | 
|   | 
| /** | 
|  * Runs provided callback asynchronously | 
|  * even if callback itself is not | 
|  * | 
|  * @param   {function} callback - callback to invoke | 
|  * @returns {function} - augmented callback | 
|  */ | 
| function async(callback) | 
| { | 
|   var isAsync = false; | 
|   | 
|   // check if async happened | 
|   defer(function() { isAsync = true; }); | 
|   | 
|   return function async_callback(err, result) | 
|   { | 
|     if (isAsync) | 
|     { | 
|       callback(err, result); | 
|     } | 
|     else | 
|     { | 
|       defer(function nextTick_callback() | 
|       { | 
|         callback(err, result); | 
|       }); | 
|     } | 
|   }; | 
| } |