javascript - 异步函数不等待 Node.js 中子进程的结果
问题描述
Javascript/Node 初学者在这里。
我已经查阅了几篇帖子(Link 1、Link 2、Link 3),但我在以下 Node.js 代码中遇到错误:
const execFile = require('child_process').execFile;
async function execute(){
let result = await sh();
console.log("RESULT: " + result);
}
async function sh(){
execFile('./demo-files/demo.sh', ['1st', '2nd', '3rd'],
function(err, data){
let returnValue;
if(err){
returnValue = "ERROR:\n" + err;
}
else {
returnValue = data.toString();
}
console.log("return value in fxn: " + returnValue);
return returnValue;
});
}
execute();
控制台输出:
RESULT: undefined
return value in fxn: 2nd
为什么我await
不等待的结果sh()
?我希望它返回值“2nd”。
(bash 脚本无关紧要;它只是echo $2
)
解决方案
你await
你的功能,但那个功能不是真的async
。当一个函数前面有async
关键字时,它实际上所做的是将整个函数包装到Promise实例中。但是,如果您不能正确处理此函数内部的内容,它将无法工作。
在您的情况下,您需要手动返回Promise实例。它接受带有resolve
&reject
参数的回调。你可以打电话resolve
来解决这个承诺:
function sh() {
return new Promise(resolve => {
execFile('./demo-files/demo.sh', ['1st', '2nd', '3rd'],
function (err, data) {
let returnValue;
if (err) {
returnValue = "ERROR:\n" + err;
}
else {
returnValue = data.toString();
}
console.log("return value in fxn: " + returnValue);
resolve(returnValue);
})
})
}
推荐阅读
- javascript - 在javascript中捕获网页上的键盘输入
- ios - 当我单击 xcode 中的单元格时,如何在 rightBarButtonItem 中放置不同的图像?
- dart - 使用多个 Dart SDK 版本的推荐方法是什么?
- angular - 使用 fileuri 无法使用离子图像预览
- java - 从 JSON/String 文件中获取特定的 JSON 属性
- javascript - 如何在使用 pywb 归档时单击带有 selenium 的按钮
- firebase - Firebase Cookie 未保存
- php - 防止rest api中的重复请求
- c - fscanf 命令无法识别空格
- django-autocomplete-light - 从自定义 html 结果中获取数据属性