如何从回调函数设置变量?如何实现sh函数返回命令执行输出?
问题分析与解决方案
你的当前实现确实不合理,核心原因在于exec是异步函数:sh函数会在exec的回调逻辑执行完毕前,就先返回std_value.result,这时候返回的必然是上一次调用留下的旧值,完全无法拿到当前命令的执行输出。
要正确返回异步操作的结果,必须使用Promises——这是JavaScript处理异步逻辑的标准方案,能避免异步回调带来的时序问题,同时让代码更易读、更易维护。
重构后的实现代码
我们可以把sh函数封装成返回Promise的形式,直接在异步回调中处理结果:
function sh(cmd) { return new Promise((resolve, reject) => { exec(cmd, (err, stdout, stderr) => { if (err) { console.log(err); reject(new Error('命令执行失败')); // 执行失败时抛出错误 return; } console.log({ stdout, stderr }); resolve(stdout); // 执行成功时返回stdout }); }); }
如何调用这个函数
你可以通过两种方式获取结果:
- 使用
.then()/.catch()链式调用:sh('ls -la') .then(output => { console.log('命令输出:', output); // 这里可以直接处理输出结果 }) .catch(error => { console.error('执行出错:', error); }); - 在async函数中使用
await(写法更简洁直观):async function runCommand() { try { const output = await sh('ls -la'); console.log('命令输出:', output); } catch (error) { console.error('执行出错:', error); } } runCommand();
额外提示
建议不要再用全局的std_value来存储结果——当多次调用sh函数时,全局变量很容易被并发调用覆盖,导致结果混乱。用Promise直接传递结果是更安全、更符合异步编程规范的做法。
内容的提问来源于stack exchange,提问作者thematdev
相关产品推荐
相关产品推荐

