code: async function _requireX(userResolver, moduledId, callback, useSyncResolve=false) {
    if (userResolver.dir) {
      console.warn(`The property userResolver.dir is deprecated, please use userResolver.basedir instead. This being used in ${getCallingFileName()}`);
    }
  
    userResolver.basedir = userResolver.basedir || userResolver.dir;
  
    try {
      const modules = await (Array.isArray(moduledId) ?
          Promise.all(moduledId.map(moduleName=>_loader(userResolver, moduleName, useSyncResolve))) :
          _loader(userResolver, moduledId, useSyncResolve)
      );
  
      if (!callback) return modules;
      setImmediate(()=>callback(null, modules));
    } catch (err) {
      if (!callback) return Promise.reject(err);
      setImmediate(()=>callback(err, undefined));
    }
  }
docs: Load a module asynchronously, this is an async version of require().  Will
  load a collection of modules if an array is supplied.  Will reject if module
  is not found or on error.
  
  @private
  @param {Object} userResolver                 User-created resolver function or an options object.
  @param {string|Array} moduledId              Module name or path (or array of either), same format as for require().
  @param {function} [callback]                 Node-style callback to use instead of (or as well as) returned promise.
  @param {boolean} [useSyncResolve=false]      Whether to use the native node require function (sychronous) or the
  require function from this module, which is async.
  @returns {Promise.<*|undefined>}             Promise, resolved with the module(s) or undefined.