Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.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 异步函数不等待Node.js中的子进程的结果_Javascript_Node.js_Async Await_Exec - Fatal编程技术网

Javascript 异步函数不等待Node.js中的子进程的结果

Javascript 异步函数不等待Node.js中的子进程的结果,javascript,node.js,async-await,exec,Javascript,Node.js,Async Await,Exec,这里是Javascript/Node初学者 我已经查阅了几篇文章(,),但我在以下Node.js代码中发现了一个错误: const execFile=require('child_process')。execFile; 异步函数execute(){ 让结果=等待sh(); console.log(“结果:+RESULT”); } 异步函数sh(){ execFile('./demo files/demo.sh',['1st','2nd','3rd'], 功能(错误、数据){ 让我们回归价值; 如

这里是Javascript/Node初学者

我已经查阅了几篇文章(,),但我在以下Node.js代码中发现了一个错误:

const execFile=require('child_process')。execFile;
异步函数execute(){
让结果=等待sh();
console.log(“结果:+RESULT”);
}
异步函数sh(){
execFile('./demo files/demo.sh',['1st','2nd','3rd'],
功能(错误、数据){
让我们回归价值;
如果(错误){
returnValue=“ERROR:\n”+err;
}
否则{
returnValue=data.toString();
}
log(“fxn中的返回值:+returnValue”);
返回值;
});
}
执行();
控制台输出:

结果:未定义
fxn中的返回值:第二个
为什么我的
要等待
而不是等待
sh()
的结果?我希望它返回值“2nd”


(bash脚本无关紧要;它只是
echo$2

等待您的函数,但该函数实际上不是
异步的。当函数前面有
async
关键字时,它实际上是将整个函数包装到实例中。但如果您不能正确处理此函数中的内容,它将无法工作

在您的情况下,您需要手动返回实例。它接受带有
resolve
reject
参数的回调。您可以致电
resolve
解决承诺:

函数sh(){
返回新承诺(解决=>{
execFile('./demo files/demo.sh',['1st','2nd','3rd'],
功能(错误、数据){
让我们回归价值;
如果(错误){
returnValue=“ERROR:\n”+err;
}
否则{
returnValue=data.toString();
}
log(“fxn中的返回值:+returnValue”);
决心(返回值);
})
})
}

等待
您的函数,但该函数并非真正的
异步
。当函数前面有
async
关键字时,它实际上是将整个函数包装到实例中。但如果您不能正确处理此函数中的内容,它将无法工作

在您的情况下,您需要手动返回实例。它接受带有
resolve
reject
参数的回调。您可以致电
resolve
解决承诺:

函数sh(){
返回新承诺(解决=>{
execFile('./demo files/demo.sh',['1st','2nd','3rd'],
功能(错误、数据){
让我们回归价值;
如果(错误){
returnValue=“ERROR:\n”+err;
}
否则{
returnValue=data.toString();
}
log(“fxn中的返回值:+returnValue”);
决心(返回值);
})
})
}

由于execFile不返回承诺,而async/await是处理承诺的语法糖,因此代码永远不能“等待”execFile运行

另一种方法是使用node.js“promisify”

然后你的sh函数可以

const util = require('util');
const execFile = util.promisify(require('child_process').execFile);

async function execute(){
  let result = await sh();
  console.log("RESULT: " + result);
}

function sh(){
  return execFile('./demo-files/demo.sh', ['1st', '2nd', '3rd'])
  .then(data => data.toString())
  .catch(err => "ERROR:\n" + err);
}
或者,使用async/await for
函数sh

const util = require('util');
const execFile = util.promisify(require('child_process').execFile);

async function execute(){
  let result = await sh();
  console.log("RESULT: " + result);
}

async function sh(){
  try {
    const data = await execFile('./demo-files/demo.sh', ['1st', '2nd', '3rd']);
    return data.toString();
  } catch (err) {
    return "ERROR:\n" + err;
  }
}

由于execFile不返回承诺,并且async/await是处理承诺的语法糖,因此代码永远不能“等待”execFile运行

另一种方法是使用node.js“promisify”

然后你的sh函数可以

const util = require('util');
const execFile = util.promisify(require('child_process').execFile);

async function execute(){
  let result = await sh();
  console.log("RESULT: " + result);
}

function sh(){
  return execFile('./demo-files/demo.sh', ['1st', '2nd', '3rd'])
  .then(data => data.toString())
  .catch(err => "ERROR:\n" + err);
}
或者,使用async/await for
函数sh

const util = require('util');
const execFile = util.promisify(require('child_process').execFile);

async function execute(){
  let result = await sh();
  console.log("RESULT: " + result);
}

async function sh(){
  try {
    const data = await execFile('./demo-files/demo.sh', ['1st', '2nd', '3rd']);
    return data.toString();
  } catch (err) {
    return "ERROR:\n" + err;
  }
}

您不必在
sh
内等待。。。你希望等什么?您甚至不从该函数返回任何内容。首先,
await
只在您等待承诺时执行一些有用的操作。第二,
sh()
不会返回承诺,所以第三,等待根本没有效果。你不在
sh
内等待。。。你希望等什么?您甚至不从该函数返回任何内容。首先,
await
只在您等待承诺时执行一些有用的操作。其次,
sh()@虽然Bravo是正确的,但请删除未使用的(令人困惑的)
async
关键字。
async
不是用来说“嘿,这个函数做了一些异步的事情”——它是用来说“我想在这个函数中使用
wait
来简化代码,删除它,这是没有必要的,特别是如果你不明白它会发生什么。我用它是因为习惯。我使用的代码风格建议将所有异步函数(包括返回承诺的函数)标记为
aync
关键字,我甚至在所有项目中都有eslint规则。@KiraLT-我敢打赌,如果在异步函数中使用它,您可能不完全理解它的作用,无论他们是否使用承诺,在这种情况下,您都不会使用
async
,因为您不需要在
sh
内部使用
wait
@虽然Bravo是正确的,但请删除未使用的(令人困惑的)
async
关键字。
async
不是用来说“嘿,这个函数做了一些异步的事情”——它是用来说“我想在这个函数中使用
wait
来简化代码,删除它,这是没有必要的,特别是如果你不明白它会发生什么。我用它是因为习惯。我使用的代码风格建议将所有异步函数(包括返回承诺的函数)标记为
aync
关键字,我甚至在所有项目中都有eslint规则。@KiraLT-我敢打赌,如果在异步函数中使用它,不管它们是否使用承诺,你都不会完全理解它的作用