首页 > 解决方案 > 异步函数不等待 Node.js 中子进程的结果

问题描述

Javascript/Node 初学者在这里。

我已经查阅了几篇帖子(Link 1Link 2Link 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

标签: javascriptnode.jsasync-awaitexec

解决方案


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);
            })
    })
}

推荐阅读