Javascript 异步函数不等待Node.js中的子进程的结果
这里是Javascript/Node初学者 我已经查阅了几篇文章(,),但我在以下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'], 功能(错误、数据){ 让我们回归价值; 如
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-我敢打赌,如果在异步函数中使用它,不管它们是否使用承诺,你都不会完全理解它的作用