Я пытаюсь переписать модуль, чтобы вернуть другое значение, чем раньше, но теперь он использует асинхронный вызов для получения этого значения. (с 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
будет асинхронным, и эта цепочка будет продолжена. Как избежать этого шаблона?