function race(tasks, callback) {
    callback = once(callback || noop);
    if (!isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions'));
    if (!tasks.length) return callback();
    for (var i = 0, l = tasks.length; i < l; i++) {
        wrapAsync(tasks[i])(callback);
    }
}
Runs the `tasks` array of functions in parallel, without waiting until the
previous function has completed. Once any of the `tasks` complete or pass an
error to its callback, the main `callback` is immediately called. It's
equivalent to `Promise.race()`.

@name race
@static
@memberOf module:ControlFlow
@method
@category Control Flow
@param {Array} tasks - An array containing [async functions]{@link AsyncFunction}
to run. Each function can complete with an optional `result` value.
@param {Function} callback - A callback to run once any of the functions have
completed. This function gets an error or result from the first function that
completed. Invoked with (err, result).
@returns undefined
@example

async.race([
    function(callback) {
        setTimeout(function() {
            callback(null, 'one');
        }, 200);
    },
    function(callback) {
        setTimeout(function() {
            callback(null, 'two');
        }, 100);
    }
],
// main callback
function(err, result) {
    // the result will be equal to 'two' as it finishes earlier
});