javascript 节点子进程等待结果

ql3eal8s  于 2023-02-18  发布在  Java
关注(0)|答案(3)|浏览(141)

我有一个异步函数,它可以调用face_detection命令行。它在其他方面工作正常,但是我不能让它等待响应。下面是我的函数:

async uploadedFile(@UploadedFile() file) {
    let isThereFace: boolean;
    const foo: child.ChildProcess = child.exec(
      `face_detection ${file.path}`,
      (error: child.ExecException, stdout: string, stderr: string) => {
        console.log(stdout.length);

        if (stdout.length > 0) {
          isThereFace = true;
        } else {
          isThereFace = false;
        }
        console.log(isThereFace);

        return isThereFace;
      },
    );

    console.log(file);

    const response = {
      filepath: file.path,
      filename: file.filename,
      isFaces: isThereFace,
    };
    console.log(response);

    return response;
  }

isThereFace在我返回的响应中总是undefined,因为响应在face_detection的响应准备好之前就发送到客户端了。

vd8tlhqk

vd8tlhqk1#

您可以使用child_process.execSync调用,它将等待exec完成。但是不鼓励执行sync调用...
或者你可以用承诺来 Package child_process.exec

const result = await new Promise((resolve, reject) => {
   child.exec(
      `face_detection ${file.path}`,
      (error: child.ExecException, stdout: string, stderr: string) => {
        if (error) {
          reject(error);
        } else {
          resolve(stdout); 
        }
      });
});
j8ag8udp

j8ag8udp2#

我认为你必须将child.exec转换成一个Promise,并将其与wait一起使用。否则异步函数不会等待child.exec结果。
为了使它更容易,你可以使用Node util.promisify方法:https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original

import util from 'util';
const exec = util.promisify(child.exec);
const result = await exec(`my command`);
rjzwgtxy

rjzwgtxy3#

一行程序就可以做到这一点:

const execute = async (command: string) => await new Promise(resolve => exec(command, resolve))
const result = await execute(`my command`);

相关问题