Nodejs - Await不会等待首先执行该方法

问题描述 投票:0回答:2

我在nodejs中编写一个函数来向macos发送print命令。问题是我的打印命令发送成功,但我想在继续前等待收到的输出。

我的代码如下

const printer = require("node-native-printer");
const exec = require("child_process").exec;
module.exports = {
  print: async function (options) {
    await this.printUnix(options).then(
      response => {
        return response
      }
    ).catch(error => {
      return false
    });
  },

  printUnix: async function (options) {
    if (!options.filePath)
      return Error('File path not specified');
    let command = 'lp ';
    let unixOptions = [];
    await Object.keys(options).forEach(value => {
      switch (value) {
        case 'duplex':
          if (options[value] === 'Default')
            command = command + '-o sides=one-sided ';
          else
            command = command + '-o sides=two-sided-short-edge ';
          break;

        case 'color':
          if (options[value])
            command = command + '-o blackplot ';
          break;

        case 'landscape':
          if (options[value])
            command = command + '-o orientation-requested=4 ';
          else command = command + '-o orientation-requested=3 ';
          break;
      }
    });
    command = command + options.filePath;

    return await this.executeQuery(command);
  },

  executeQuery: async function (command) {
    exec(command, function (error, stdout, stderr) {
      output = {stdout, error, stderr};
      if (!stdout || stderr || error)
        return false;
      else
        return true;
    });
  }
};

这里的问题是函数executeQuery没有完全执行,结果返回,即未定义。如何让我的程序等待函数正确执行?

node.js async-await
2个回答
1
投票

executeQuery无法按预期工作,因为您已将Async-Await与回调混合使用。

您不能将Async-await语法与回调一起使用。您必须按照以下方式宣传您的回调函数。

    function(command){
        return new Promise(resolve, reject){
             exec(command, function (error, stdout, stderr) {
             output = {stdout, error, stderr};
             if (!stdout || stderr || error)
                 reject();
             else
                 resolve();
             })
        }
    }

1
投票

好吧,这似乎是错的

   await this.printUnix(options).then(
      response => {
        return response
      }
    ).catch(error => {
      return false
    });
  },

当您使用async / await时。你不能使用承诺回调.then.catch(可能)

尝试将代码更改为这样的代码

 print: async function (options) {
   try {
     return await this.printUnix(options)
     } catch (error) {
      return false
  },
© www.soinside.com 2019 - 2024. All rights reserved.