Я пытаюсь переписать модуль, чтобы вернуть другое значение, чем раньше, но теперь он использует асинхронный вызов для получения этого значения. (с child_process если это имеет значение). Я завернул его в обещание, но это не критично для меня - оно может быть в исходном обратном вызове child_process, но проблема в том, что я не могу связать обещание везде в приложении, потому что мне нужно, чтобы это стало синхронным. Здесь мой модуль:
exec = require('child_process').exec
platformHome = process.env[if process.platform is 'win32' then 'USERPROFILE' else 'HOME']
getExecPath = new Promise (resolve, reject) ->
  path = process.env.GEM_HOME
  if path
    resolve(path)
  else
    exec 'gem environment', (err, stdout, stderr) ->
      unless err
        line = stdout.split(/\r?\n/)
                 .find((l) -> ~l.indexOf('EXECUTABLE DIRECTORY'))
        if line
          resolve line[line.indexOf(': ') + 2..]
        else
          reject undefined
GEM_HOME = undefined
getExecPath.then (path) ->
  GEM_HOME = path
.catch ->
  GEM_HOME = "#{platformHome}/.gem/ruby/2.3.0"
.then =>
  module.exports = GEM_HOME // or simply return it
Очевидно, что при требовании модуля это не сработает - и если я верну свое обещание и использую then после require, мой следующий module.exports будет асинхронным, и эта цепочка будет продолжена. Как избежать этого шаблона?
