I'm trying to rewrite a module to return a different value than before, but now it uses an async call to get that value. (with child_process
if it matters). I've wrapped it in a Promise, but that's not critical to me - it can be in the original child_process callback, but the problem is I can't chain the promise to everywhere in the app because I need this to become synchronous. Here's my module:
const { exec } = require("child_process");
const platformHome = process.env[process.platform === "win32" ? "USERPROFILE" : "HOME"];
const getExecPath = new Promise((resolve, reject) => {
const path = process.env.GEM_HOME;
if (path) {
resolve(path);
return;
}
exec("gem environment", (err, stdout, err) => {
if (err) {
reject(err);
}
const line = stdout.split(/\r?\n/).find(l => ~l.indexOf("EXECUTABLE DIRECTORY"));
if (line) {
resolve(line.substring(line.indexOf(": ") + 2));
} else {
reject(undefined);
}
});
});
let 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
);
Clearly, when requiring the module, this doesn't work - and if I return the promise itself, and use then
after require
- my next module.exports
will be async, and this chain will carry on. How do I avoid this pattern?