Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从回调函数设置变量?_Javascript_Node.js - Fatal编程技术网

Javascript 如何从回调函数设置变量?

Javascript 如何从回调函数设置变量?,javascript,node.js,Javascript,Node.js,我有下面的函数 function sh(cmd) { exec(cmd, (err, stdout, stderr) => { if (err) { console.log(err); std_value.flush(); std_value.set("error"); } else { console.log({stdout, stderr}); std_value.flush

我有下面的函数

function sh(cmd) {
    exec(cmd, (err, stdout, stderr) => {
      if (err) {
        console.log(err);
        std_value.flush();
        std_value.set("error");
      } else {
        console.log({stdout, stderr});
        std_value.flush();
        std_value.set(stdout);
        console.log('std_value in ' + std_value.result);
      }
    });
    console.log('std_value out ' + std_value.result);
    return std_value.result;
}

我想
sh(cmd)
返回
cmd
的输出。所以我使用了下面的方法(有点糟糕)。但是
exec
是异步函数,因此外部
std_值。结果将是上次调用的值。这是创建
sh(cmd)
的正常方法,它将返回标准输出还是我应该使用承诺?

您可以在这里使用承诺,因为您不能从回调/异步函数返回值

function sh(cmd) {
  return new Promise((resolve, reject) => {
    exec(cmd, (err, stdout, stderr) => {
      if (err) {
        console.log(err);
        std_value.flush();
        std_value.set("error");
        reject(err);
      } else {
        console.log({stdout, stderr});
        std_value.flush();
        std_value.set(stdout);
        console.log('std_value in ' + std_value.result);

        resolve(std_value.result);
      }
    });
  })
}

sh().then(val => {
  console.log(val); //this should console the value of std_value.result
})

注意:我不知道您从哪里获得的
std_值

您可以在这里使用promise,因为您无法从回调/异步函数返回值

function sh(cmd) {
  return new Promise((resolve, reject) => {
    exec(cmd, (err, stdout, stderr) => {
      if (err) {
        console.log(err);
        std_value.flush();
        std_value.set("error");
        reject(err);
      } else {
        console.log({stdout, stderr});
        std_value.flush();
        std_value.set(stdout);
        console.log('std_value in ' + std_value.result);

        resolve(std_value.result);
      }
    });
  })
}

sh().then(val => {
  console.log(val); //this should console the value of std_value.result
})
注意:我不知道你从哪里得到的标准值 函数sh(cmd,回调){ exec(cmd,(err,stdout,stderr)=>{ 如果(错误){ 控制台日志(err); 标准_值。冲洗(); 标准值设置(“错误”); 如果(!!回调){ 回调(err); } }否则{ log({stdout,stderr}); 标准_值。冲洗(); 标准值设置(标准值); 日志('std_value in'+std_value.result'); 如果(!!回调){ 回调(标准值.result); } } }); } sh(“运行”,函数(结果){ 控制台日志(结果); }); 函数sh(cmd,回调){ exec(cmd,(err,stdout,stderr)=>{ 如果(错误){ 控制台日志(err); 标准_值。冲洗(); 标准值设置(“错误”); 如果(!!回调){ 回调(err); } }否则{ log({stdout,stderr}); 标准_值。冲洗(); 标准值设置(标准值); 日志('std_value in'+std_value.result'); 如果(!!回调){ 回调(标准值.result); } } }); } sh(“运行”,函数(结果){ 控制台日志(结果); });副本的副本