You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从回调函数设置变量?如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:17:30